首页 > 其他分享 >如何创建自己的Spring Boot Starter并为其编写单元测试

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

时间:2024-02-27 16:56:44浏览次数:23  
标签:spring 配置 boot 单元测试 Boot Spring Starter

当我们想要封装一些自定义功能给别人使用的时候,创建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 提供单元测试

掌握这项技能可以帮你更好的为Spring Boot提供模块划的功能封装。如果您学习过程中如遇困难?可以加入我们超高质量的Spring技术交流群,参与交流与讨论,更好的学习与进步!更多Spring Boot教程可以点击直达!,欢迎收藏与转发支持!

最后再给大家推荐一些有关Spring Boot Starter和自动化配置的扩展阅读:

欢迎关注我的公众号:程序猿DD。第一时间了解前沿行业消息、分享深度技术干货、获取优质学习资源

标签:spring,配置,boot,单元测试,Boot,Spring,Starter
From: https://www.cnblogs.com/didispace/p/18037231

相关文章

  • springboot2.6开始禁止循环依赖了
    参考文章: https://mp.weixin.qq.com/s?__biz=MzI0MTUwOTgyOQ==&mid=2247497189&idx=1&sn=0f03cdafad9bacef66c64a490b85ff23&scene=21#wechat_redirect使用了SpringBoot2.6及以上版本的,如果要允许循环依赖,可以作如下设置:方案二:允许循环引用此方案更像是绕过问题而非解决问题......
  • 解析Spring中的循环依赖问题:初探三级缓存
    什么是循环依赖?这个情况很简单,即A对象依赖B对象,同时B对象也依赖A对象,让我们来简单看一下。//A依赖了BclassA{publicBb;}//B依赖了AclassB{publicAa;}这种循环依赖可能会引发问题吗?在没有考虑Spring框架的情况下,循环依赖并不会带来问题,因为对象之间相互依赖......
  • SpringCloud和SpringBoot的版本依赖该怎么选择
    前言SpringCloud是一个基于SpringBoot的微服务框架,用于构建和管理分布式系统的各个组件。它提供了一套完整的解决方案,包括服务注册与发现、配置管理、负载均衡、熔断器、消息总线、数据流等功能。SpringCloud2023为当前SpringCloud的最新版本迭代,基于Spring6和Springboot3以......
  • Spring Security权限控制框架使用指南
    在常用的后台管理系统中,通常都会有访问权限控制的需求,用于限制不同人员对于接口的访问能力,如果用户不具备指定的权限,则不能访问某些接口。本文将用waynboot-mall项目举例,给大家介绍常见后管系统如何引入权限控制框架SpringSecurity。大纲如下,一、什么是SpringSecurityS......
  • .net+bootstrap写的一个还不错的音乐网站
    以前做的一款设计音乐网站,分享下。技术用的是.net+sqlserver  大致的样子是这样的。1、首页如下: 2、播放歌词页面如下:歌词自动滚动,且可悬停。 3、歌单信息页面如下:详细页面如下:可删除歌单中歌曲信息。 编辑页面如下:可进行编辑封面和歌单名、简介等。 个人信息......
  • 学习python自动化——pytest单元测试框架
    一、什么是pytest单元测试框架,unittest(python自带的),pytest(第三方库)。用于编写测试用例、收集用例、执行用例、生成测试结果文件(html、xml)1.1、安装pytestpipinstallpytest1.2、导入importpytest二、步骤2.1、TestCase(测试用例)2.1.1、创建测试类......
  • SpringBoot/Java中OCR实现,集成Tess4J实现图片文字识别
    场景TesseractTesseract是一个开源的光学字符识别(OCR)引擎,它可以将图像中的文字转换为计算机可读的文本。支持多种语言和书面语言,并且可以在命令行中执行。它是一个流行的开源OCR工具,可以在许多不同的操作系统上运行。https://github.com/tesseract-ocr/tesseractTess4JTess4......
  • Spring Boot 信息泄露总结
    1.目标2.微信sessionkey泄露导致任意用户登录点击快捷登录,发现可以使用手机号进行登录发现sessionkey,使用工具利用没有账号,尝试13111111111(一般测试账号是这个),成功登录 3.进行指纹识别,发现为SpringBoot框架,测试发现SpringActuator信息泄露 4.发现actuator/gate......
  • Springboot的starter有什么用以及如何自定义一个starter
    SpringBoot的starter是什么我们都知道SpringBoot的目的就是为了让开发者尽可能的减少项目配置专注于程序代码的编写,而'starter'就是SpringBoot简便开发、自动装配的具体实现。以‘mybatis-spring-boot-starter’为例:<dependency><groupId>org.mybatis.spring.boot<......
  • springboot3 security6.0.2 session timeout 方案
    方案1packagejp.co.toppan.dch.web.core.security;importjakarta.servlet.ServletException;importjakarta.servlet.http.Cookie;importjakarta.servlet.http.HttpServletRequest;importjakarta.servlet.http.HttpServletResponse;importorg.apache.commons.lang3.S......