写点什么

如何创建自己的 Spring Boot Starter 并为其编写单元测试

作者:EquatorCoco
  • 2024-02-28
    福建
  • 本文字数:1930 字

    阅读完需:约 6 分钟

当我们想要封装一些自定义功能给别人使用的时候,创建 Spring Boot Starter 的形式是最好的实现方式。如果您还不会构建自己的 Spring Boot Starter 的话,本文将带你一起创建一个自己的 Spring Boot Starter。


快速入门


  1. 创建一个新的 Maven 项目。第三方封装的命名格式是 xxx-spring-boot-starter ,例如:didispace-spring-boot-starter

  2. 编辑pom.xml,添加spring-boot-autoconfigurespring-boot-starter依赖


<dependencies>    <dependency>        <groupId>org.springframework.boot</groupId>        <artifactId>spring-boot-starter</artifactId>    </dependency>    <dependency>        <groupId>org.springframework.boot</groupId>        <artifactId>spring-boot-autoconfigure</artifactId>    </dependency></dependencies>
复制代码


  1. 创建一个用 @Configuration 注释的配置类,在这里您可以使用@Bean来创建使用@ConditionalOnClass@ConditionalOnMissingBean等条件注释来控制何时应用配置。


@Configuration@ConditionalOnClass(MyFeature.class)@ConditionalOnProperty(prefix = "myfeature", name = "enabled", matchIfMissing = true)public class MyFeatureAutoConfiguration {
@Bean @ConditionalOnMissingBean public MyFeature myFeature() { return new MyFeature(); }}
复制代码


  1. src/main/resources/META-INF目录下创建spring.factories文件,并在org.springframework.boot.autoconfigure.EnableAutoConfiguration关键字下列出您的自动配置类,比如:


org.springframework.boot.autoconfigure.EnableAutoConfiguration=\com.didispace.myfeature.MyFeatureAutoConfiguration
复制代码


该配置的作用是让 Spring Boot 应用在引入您自定义 Starter 的时候可以自动这里的配置类。


注意:Spring Boot 2.7 开始,不再推荐使用spring.factories,而是改用/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports,文件内容直接放需要自动加载配置类路径即可。这个变更具体可见之前的这篇文章:《Spring Boot 2.7开始spring.factories不推荐使用了》


验证测试


在制作 Spring Boot Starter 的时候,一定记得使用单元测试来验证和确保自动化配置类在任何条件逻辑在启动器下能够按照正确的预期运行。


创建单元测试


使用@SpringBootTest加载完整的应用程序上下文,并验证启动程序是否正确配置了 Bean 和属性。


@SpringBootTest(classes = TestApplication.class)public class MyStarterAutoConfigurationTest {
@Autowired(required = false) private MyService myService;
@Test public void testMyServiceAutoConfigured() { assertNotNull(myService, "MyService should be auto-configured"); }}
复制代码


覆盖不同的配置


如果有不同的配置方案,那么还需要使用@TestPropertySource@DynamicPropertySource覆盖属性以测试不同配置下的情况。


或者也可以直接简单的通过@SpringBootTest中的属性来配置,比如下面这样:


@SpringBootTest(properties = "my.starter.custom-property=customValue")public class MyStarterPropertiesTest {
@Value("${my.starter.custom-property}") private String customProperty;
@Test public void testPropertyOverride() { assertEquals("customValue", customProperty, "Custom property should be overridden by @SpringBootTest"); }}
复制代码


覆盖@Conditional的不同分支


如果您的启动器包含条件配置,比如:@ConditionalOnProperty@ConditionalOnClass等注解,那么就必须编写测试来覆盖所有条件以验证是否已正确。


比如下面这样:


@SpringBootTest(classes = {TestApplication.class, MyConditionalConfiguration.class})@ConditionalOnProperty(name = "my.starter.enable", havingValue = "true")public class MyStarterConditionalTest {
@Autowired private ApplicationContext context;
@Test public void conditionalBeanNotLoadedWhenPropertyIsFalse() { assertFalse( context.containsBean("conditionalBean"), "Conditional bean should not be loaded when 'my.starter.enable' is false" ); }}
复制代码


为了覆盖不同的条件分支,我们通常还需要使用@TestConfiguration注解来有选择地启用或禁用某些自动配置。


小结


本文介绍了两个 Spring Boot 的进阶内容:

  1. 如何创建 Spring Boot Starter

  2. 如何为 Spring Boot Starter 提供单元测试


文章转载自:程序猿DD

原文链接:https://www.cnblogs.com/didispace/p/18037231

体验地址:http://www.jnpfsoft.com/?from=001

用户头像

EquatorCoco

关注

还未添加个人签名 2023-06-19 加入

还未添加个人简介

评论

发布
暂无评论
如何创建自己的Spring Boot Starter并为其编写单元测试_Spring Boot_EquatorCoco_InfoQ写作社区