SpringBoot+Mybatisフレームワークプロジェクトのユニットテストと統合テスト(下)

7885 ワード

統合テスト


統合テストでは、サービスを開始し、データベースに接続する必要があるため、このブロックを構成する必要があります.私は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コンテナコンテキストを破壊するテスト方法がある場合は、Spring TestContextがテスト後にSpringコンテナのコンテキストをリフレッシュするために、テスト方法に@DirtiesContext注記を明示的に追加できます.
  • 問題2:データソース構成に問題がある
    <dependency>
        <groupId>org.mybatis.spring.bootgroupId>
        <artifactId>mybatis-spring-boot-starterartifactId>
    dependency>
    <dependency>
        <artifactId>tomcat-jdbcartifactId>
        <groupId>org.apache.tomcatgroupId>
    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の1つの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を入れます!