SpringBoot+Mybatis框架项目的单元测试和集成测试(下)

集成测试

集成测试需要启动服务,并且连接数据库,因此配置这一块要做到位。本人之前没有接触过SpringBoot集成测试,故踩了以下3个大坑,希望分享给大家!

  • 问题1:SpringBoot的自动装配、yml文件都无法导入
    在测试过程中,发现如果只是添加:

    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(locations = {"application.yml"})
    @DirtiesContext

    就进行测试,是会识别不了yml属性配置文件的,而且还会报“第一行有无法识别的字符”的错误,应当按照下面来:

    @RunWith(SpringJUnit4ClassRunner.class)
    @SpringBootTest(
            classes = Application.class,
            webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT
    )
    @DirtiesContext

    在这个里面,我们发现了@SpringBootTest的注解,它是用来进行SpringBoot项目的测试的,其中:

    classes = Application.class,

    这个不是必须加上的,你也可以对这个测试类进行打包,放到package下面,这样他也能够识别到Application这个SpringBoot的启动项。
    而@DirtiesContext:如果某个测试方法确实会破坏 Spring 容器上下文,你可以显式地为该测试方法添加 @DirtiesContext 注解,以便 Spring TestContext 在测试该方法后刷新 Spring 容器的上下文。

  • 问题2:数据源配置有问题

    <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
    </dependency>
    <dependency>
        <artifactId>tomcat-jdbc</artifactId>
        <groupId>org.apache.tomcat</groupId>
    </dependency>

    在mybatis-Spring-boot-starter中是默认jdbc作为数据源的!
    而之前的pom中忘记引入tomcat-jdbc这个依赖项了,所以找不到数据源!
    在分库中,就会用到这个原理!
    多个数据源之间进行切换。

    @ConditionalOnClass(org.apache.tomcat.jdbc.pool.DataSource.class)
    @ConditionalOnProperty(name = "spring.datasource.type", havingValue = "org.apache.tomcat.jdbc.pool.DataSource", matchIfMissing = true)
    static class Tomcat extends DataSourceConfiguration {
    
       @Bean
       @ConfigurationProperties("spring.datasource.tomcat")
       public org.apache.tomcat.jdbc.pool.DataSource dataSource(
             DataSourceProperties properties) {
          org.apache.tomcat.jdbc.pool.DataSource dataSource = createDataSource(
                properties, org.apache.tomcat.jdbc.pool.DataSource.class);
          DatabaseDriver databaseDriver = DatabaseDriver
                .fromJdbcUrl(properties.determineUrl());
          String validationQuery = databaseDriver.getValidationQuery();
          if (validationQuery != null) {
             dataSource.setTestOnBorrow(true);
             dataSource.setValidationQuery(validationQuery);
          }
          return dataSource;
       }
    
    }

    以上代码是Spring-Boot-autoconfigure jar包中的DataSourceConfiguration.java配置文件,他专门用来识别各种数据源。 其中,`@ConfigurationOnProperty()`表示没有匹配上这个数据源,就会去加载下面这个数据源的配置。 而`@ConditionalOnClass()`表示需要opg.apache.tomcat.jdbc.pool.DataSource.class类,才会去加载这个数据源!

  • 问题3:测试Controller必须要通过@Autowired注入

    @RunWith(SpringJUnit4ClassRunner.class)
    @SpringBootTest(
            classes = Application.class,
            webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT
    )
    @DirtiesContext
    public class dataOpTest {
    
        private TBookController tBookController = new TBookController();
        public TBookMapper tBookMapper;
    
        @Test
        public void testIfExistByName(){
            String bk_name = "c++";
            int existCount = tBookController.ifExist(bk_name);
            Assert.assertEquals(existCount, 1);
        }
    }

    这样单纯的去new一个controller,只会报空指针异常,只有:

    @RunWith(SpringJUnit4ClassRunner.class)
    @SpringBootTest(
            classes = Application.class,
            webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT
    )
    @DirtiesContext
    public class dataOpTest {
    
        @AutoWired
        private TBookController tBookController = new TBookController();
        public TBookMapper tBookMapper;
    
        @Test
        public void testIfExistByName(){
            String bk_name = "c++";
            int existCount = tBookController.ifExist(bk_name);
            Assert.assertEquals(existCount, 1);
        }
    }
    

    @Autowired才会将controller需要加载的各个bean都装在进来!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值