SpringBoot下进行单元测试

这篇具有很好参考价值的文章主要介绍了SpringBoot下进行单元测试。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

工程升级SpringBoot之后,突然发现之前写的几个简单的单元测试类无法正常执行了,因为SpringBoot工程的配置方式与之前还是有比较大的差异。

而且之前直接使用Junit来写单元测试,这一次打算直接升级到SpringBoot的Test方式。

1、引入依赖包

之前是直接引用junit依赖包,需要更改为spring-boot-starter-test(里面包含了对junit的依赖)

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>

2、对于需要创建Unit Test的类/方法,直接在IDEA里右键->go to -> Test

IDEA会自动创建对应的Test类,然后编写对应的测试代码即可。

需要注意的是,SpringBoot有默认的约定,测试类需要与被测试类在相同的package下(目录结构一个是main,一个是test,后面的目录结构都是一样的)

在创建好的类上需要加上Test相关的注解即可:

@SpringBootTest

@RunWith(SpringRunner.class)

方法上加上@Test注解(与Junit一样的)

建议创建一个基类,然后将注解直接放在基类上,这样其他的测试类可以直接extends该基类即可。

3、由于工程配置文件里面有敏感信息,故配置文件都不在工程默认目录下,而是通过启动参数指定的配置文件

此时,对于Test类,就需要通过参数进行指定配置文件,来覆盖默认的配置。

@SpringBootTest
@RunWith(SpringRunner.class)
@TestPropertySource(
locations = { "file:XXXXX\\application-dev.properties", "file:XXXXX\\bootstrap-dev.properties" }, properties = "spring.cloud.nacos.discovery.password=YYYYYYY")

需要注意的是,SpringBoot的TestPropertySource是不支持yml文件格式的,目前只能通过properties文件来进行配置。(个别参数可以直接通过properties参数进行指定)

https://github.com/spring-projects/spring-boot/issues/10772https://github.com/spring-projects/spring-boot/issues/10772

试了很多网上的方法都没有成功(Spring @PropertySource using YAML - Stack Overflow),最后看到SpringBootTest注解上支持args参数,可以通过args指定启动参数,这样就可以通过spring.config.location来指定yml配置文件了。

需要注意,如果args有多个参数的时候,解析好像有BUG,无法正常处理,比如下面的配置,如果将nacos的password也放在args里面,会导致password错误。

@SpringBootTest( args = "--spring.cloud.nacos.discovery.password=YYYYYY --spring.config.location=classpath:/,XXXXXX\\application-dev.yml,XXXXXX\\bootstrap-dev.yml")

需要改成如下形式才可以:

@SpringBootTest(properties = "spring.cloud.nacos.discovery.password=YYYYYYY",

args = "--spring.config.location=classpath:/,XXXXXX\\application-dev.yml,XXXXXX\\bootstrap-dev.yml")

4、前面提到SpringBoot有默认的约定,自动生成的测试类会在相同的package下,但是如果我需要自定义一些测试类,与main下面的类或者方法没有关联。此时自定义的类放在我们自定义的一个package里面。

如果此时直接继承上面的基类,则会出现:Unable to find a @SpringBootConfiguration,异常。

其实,主要是SpringBootTest在启动时,默认进行了特定目录的扫描,找到启动类:SpringBootApplication注解标注的类。

而此时自定义的类在test目录下的package里面,与main不再同一个目录,故无法扫描到启动类。

此时,只需要增加一个参数指定一下启动类即可。(springboot单元测试Unable to find a @SpringBootConfiguration的两种解决方法以及原理 - 简书springboot单元测试大部分情况很简单,只用增加2个注解就行: 注意是大部分情况,因为springboot约定大于配置,如果你不按它的约定,就会出现下面的错误Unabl...https://www.jianshu.com/p/1b80e5c4bb02)

@SpringBootTest(classes = TaApplication.class)

5、SpringBootTest会加载整个ApplicationContext,所以可以在Test类里直接使用@Autowired来注入其他的bean。

但是会有两种特殊情况需要处理,一种是只需要简单测试某一个类,不希望加载所有的context(会比较耗时);另一种是在test目录下定义了一个bean对象,但是在默认的context下不会扫描test下的bean,导致autowired时候无法找到该bean。

此时也有两种方式来处理:

1> 定义一个configuration类,然后指定需要扫描的类或者package,然后在SpringBootTest上指定需要启动的类为该configuration类即可。

@Configuration
@ComponentScan("com.spring.temp")
public class TestConfig {
}

@SpringBootTest(classes = TestConfig.class)
public class TimeLogTest extends BaseTest {……}

说明,因为有时候需要测试的类依赖比较多,需要全部加载context,但是又依赖一个test目录下的bean,此时也可以通过此方式来解决。

将configuration类的扫描范围扩大

@Configuration
@ComponentScan("com.spring.*")
public class TestConfig {

}

然后,在测试类上指定TestConfig类为启动类,通过properties和args指定相应参数即可。

@SpringBootTest(classes = TestConfig.class,
properties = "spring.cloud.nacos.discovery.password=YYYYYY",
args = "--spring.config.location=classpath:/,XXXXXX\\application-dev.yml,XXXXXX\\bootstrap-dev.yml")


public class TimeLogTest extends BaseTest {……}

2> 不使用SpringBootTest来加载,通过TestConfiguration注解来配置(其实与SpringBootTest指定configuration类是一样的原理)

@RunWith(SpringRunner.class)
public class TimeLogTest2 {
    @TestConfiguration
    static class TestConfig {
        @Bean
        public MethodTimeLogService methodTimeLogService() {
        return new MethodTimeLogService();
    }
}
@Autowired
private MethodTimeLogService methodTimeLogService;

@Test
public void test() {
    methodTimeLogService.logTest();
    System.out.println(methodTimeLogService.logTest2());

    System.out.println(methodTimeLogService.logTest3("333333", new String[] { "value2",             "value22" }));
    }
}

Testing in Spring Boot | BaeldungLearn about how the Spring Boot supports testing, to write unit tests efficiently.https://www.baeldung.com/spring-boot-testing

Configuring base package for component scan in Spring boot test - Stack Overflowhttps://stackoverflow.com/questions/48747421/configuring-base-package-for-component-scan-in-spring-boot-test

6、关于日志xml文件

为了方便对不同环境进行不同的日志配置(比如日志级别,日志文件路径等),在log4j2的XML里使用了变量引用。(https://logging.apache.org/log4j/2.x/log4j-spring-boot/index.htmlhttps://logging.apache.org/log4j/2.x/log4j-spring-boot/index.html

在XML配置文件里面,可以直接引用spring的变量配置,于是能够根据工程配置文件(如application.yml)里面的配置对log进行动态配置。

但是在unit test下,一直无法正常获取到变量,应该是springboot test没有对这种情况进行支持。尝试了很多方法,最后都无效。

考虑到unit test对于日志需求不多,只需要考虑简单输出即可。于是在test目录下创建resources目录,然后创建一个log4j2-spring.xml文件,此时spring test会自动使用该配置文件。然后该配置文件里面去除掉spring变量的引用即可。

7、在写一个测试类的时候,添加了@Test注解,但是IDEA却一直提示无法执行该测试方法(没有执行的小图标)。看了一会才发现,原来是用错了@Test注解类。

正常应该用org.junit.jupiter.api.Test类,而刚才使用了org.junit.Test。修改了一下,一切正常。于是好奇为啥Junit会提供两个Test注解类。查看官方文档,才发现,原来是因为一个是Junit4,一个是Junit5的。继续查看文档,才发现SpringBoot Test包为了兼容Junit4,自动添加了对vintage引擎(Junit4版本的引擎,Junit5的引擎是jupiter)的依赖(2.4.0以后的版本将不再默认添加vintage引擎),同时看到官方文档里面有默认推荐配置,需要将vintage引擎依赖包排除。于是修改pom配置:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
    <exclusions>
        <exclusion>
        <groupId>org.junit.vintage</groupId>
        <artifactId>junit-vintage-engine</artifactId>
        </exclusion>
    </exclusions>
</dependency>

改完之后发现很多测试类报错了,原来之前写的很多类都是用的Junit4的Test注解。逐个类进行处理,到时没有啥特别的。

需要注意的是,对于Junit5,通过SpringBootTest注解,已经不再需要@RunWith注解了。

而对于部分不需要SpringBootTest的情况,@RunWith注解也发生了变化,需要改成:@ExtendWith(SpringExtension.class)即可。其他变动都是无感的。文章来源地址https://www.toymoban.com/news/detail-720711.html

到了这里,关于SpringBoot下进行单元测试的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SpringBoot 如何使用 Spring Test 进行集成测试

    在开发过程中,单元测试是不可或缺的,它可以帮助我们及时发现代码的问题并进行修复,从而提高代码的质量和可维护性。但是,单元测试只能测试单个方法或类的功能,无法测试多个模块之间的交互和整个应用程序的功能。因此,为了确保应用程序的正确性和健壮性,我

    2024年02月10日
    浏览(46)
  • SpringBoot下进行单元测试

    工程升级SpringBoot之后,突然发现之前写的几个简单的单元测试类无法正常执行了,因为SpringBoot工程的配置方式与之前还是有比较大的差异。 而且之前直接使用Junit来写单元测试,这一次打算直接升级到SpringBoot的Test方式。 1、引入依赖包 之前是直接引用junit依赖包,需要更改

    2024年02月08日
    浏览(44)
  • 若依SpringBoot添加单元测试类及测试类启动报错

    在admin 模块中添加单元测试 将以下依赖添加到 admin 的 pom.xml 中 在 src 目录下创建 test.java.MainTests 文件 错误提示: java.lang.IllegalStateException: Failed to load ApplicationContext Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘serverEndpointExporter’ defined in class

    2024年01月20日
    浏览(38)
  • springboot对service方法进行单元测试

    1. 在pom.xml文件添加依赖 2. service类 这里为了简化,没有将接口和实现单独定义。 3. 测试类 @SpringBootTest注解会将springboot程序完整的运行起来。还可以写成@SpringBootTest(classes = OrderApplication.class),即指定启动类。  4. 执行测试 5. 除了启动整个应用以外,还可以只加载需要的组件

    2024年02月11日
    浏览(45)
  • springboot对controller方法进行单元测试

    单元测试有助于验证程序的执行逻辑是否正确。controller层的单元测试,已经和接口测试很类似了。执行单元测试以前,需要添加测试依赖。 1. 生成一个单元测试基础类 注意需要添加的注解。 2. 没有参数的单元测试 执行单元测试,可以看到如下输出: 3. 有参数的单元测试(

    2024年02月11日
    浏览(77)
  • idea中添加单元测试@Test注解引入

    添加依赖,使用 @Test 即可。 @Test注解找不到或没有的原因: 我们要进行项目的某部分的test测试,会放在名为test的文件夹下,而现在我们的文件夹测试并不是test下面的一个测试,所以如果我们希望在别的地方也可以利用test注解,只需要去掉scope这一行就行了。

    2024年02月22日
    浏览(40)
  • 使用Simulink Test进行单元测试

    本文摘要:主要介绍如何利用Simulink Test工具箱,对模型进行单元测试。内容包括,如何创建Test Harness模型,如何自动生成excel格式的测试用例模板来创建测试用例,如何手动填写excel格式的测试用例模板来手动创建测试用例。 单元测试的目的 创建完模型后,我们需要验证模型

    2024年02月16日
    浏览(41)
  • 利用Simulink Test进行模型单元测试 - 1

    随手搭建了一个demo模型MilTestModel,模型中不带参数 1.模型空白处右击 测试框架 为‘MilTestModel’创建 菜单 2.在创建测试框架对话框中,点击OK,对应的测试框架MilTestMode_Harness1就自动打开了 1.在HARNESS标签下点击 Simulik Test Manager 2.在Simulink Test Manager中,点击New TestFile打开保存文

    2024年02月13日
    浏览(33)
  • 若依微服务版(SpringBoot/SpringCloudAlibaba)中在单个服务模块中进行单元测试

    若依微服务版手把手教你本地搭建环境并运行前后端项目: 若依微服务版手把手教你本地搭建环境并运行前后端项目_霸道流氓气质的博客-CSDN博客 在上面的基础上需要在某个服务模块中进行单元测试。 注: 博客: 霸道流氓气质的博客_CSDN博客-C#,架构之路,SpringBoot领域博主

    2024年02月06日
    浏览(54)
  • [C++] 基础教程 - 如何使用google test进行单元测试

    https://download.csdn.net/download/u011775793/88601877 单元测试是一种软件测试方法,用于测试代码中的最小可测试单元。在软件开发中,我们通常将代码分解为多个模块或类,每个模块或类都有自己的功能和行为。单元测试的目的是确保每个模块或类都能正常工作,不会影响其他模块或

    2024年02月04日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包