Springbootテスト

7916 ワード

Springbootテスト
  • @RunWith
  • @ContextConfiguration
  • XML方式
  • classpathとclasspath*の違い:
  • Java方式
  • SpringBootテスト
  • @SpringBootTes
  • SpringBootテスト手順
  • 具体的な試験例1
  • 具体的な試験例2
  • 起動エントリクラス
  • を記述する.
  • Controllerクラス作成
  • 作成テストクラス
  • 試験環境でbean
  • を取得する
  • テスト環境でのみ有効なbean
  • 参考文献
  • @RunWith
    @RunWithは中国語に訳してテストランナで、JUnitのすべてのテスト方法はテストランナが実行します.クラスが@RunWithコメントを使用するか、@RunWithコメントを使用するクラスを継承すると、JUnitは開発者がjunit内部で構築するのではなく、参照されたクラスを呼び出してクラス内のテストを実行します.
    JUnitはユニットテストにデフォルトのテストランナBlockJUnit 4 ClassRunnerを提供したが、デフォルトのランナを使用する必要は制限されていない.@RunWith(JUnit 4.class)とは、JUnit 4で実行することです
    @RunWith(SpringJUnit 4 ClassRunner.class)は、Springテスト環境@RunWith(SpringRunner.class):SpringRunnerはSpringJUnit 4 ClassRunnerの別名です.
    @RunWith(Suite.class)ならテストセットですが、
    @ContextConfiguration
    @ContextConfiguration注記は、通常@RunWith注記とともに使用されるbeanをテストクラスにインポートしたいことを示します.
    クラスに注記@Componentが追加されると、自動的にbeanになり、Springプロファイルに表示される構成は不要になります.これらのbeanを集めるには通常2つの方法がある:Javaの方法とXMLの方法.これらのbeanが収集された後、あるテストクラスで@Autowired注釈を使用してこれらの収集されたbeanを導入したい場合は、このテストクラスに@ContextConfiguration注釈を追加して、このテストクラスをインポートしたいいくつかのbeanを表示するだけです.
    XML方式
    まず、高齢者が使用するXMLの方法を見てみましょう.
    
    
    
    
    

    このXMLファイルは、comパッケージのbeanをすべてラベルで自動的にスキャンします.
    次はテストできます.
    普通はこう書きます.
    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(locations = {"classpath*:/*.xml"})
    public class CDPlayerTest {
    
    }
    

    @ContextConfigurationカッコのlocations={"classpath***.xml"}はclassパスのすべてを表す.xmlファイルが含まれている場合、作成したばかりのXMLファイルが含まれている場合、自動スキャンのbeanが入手できます.この場合、テストクラスで@Autowired注釈を使用して、以前に自動スキャンパッケージの下にあったすべてのbeanを取得できます.
    classpathとclasspath*の違い:
    classpath:classパスでファイルを探すだけです.
    classpath*:classパスだけでなくjarファイル(classパス)でも検索できます.単一ファイル
    @ContextConfiguration(Locations=“classpath:applicationContext.xml”) @ContextConfiguration(classes = SimpleConfiguration.class)
    複数のファイルの場合、{}を使用できます.
    @ContextConfiguration(locations = { “classpath:spring1.xml”, “classpath:spring2.xml” })
    Java方式
    Javaを使うと簡単になりますが、XMLほど煩雑なファイルを書く必要はありません.XMLファイルの代わりにJavaクラスを作成することができます.このクラスに@Configuration注釈を付けるだけで、@ComponentScan注釈を加えると自動スキャンが開きます.注釈に括弧の中のものがなければ、@ComponentScanのデフォルトでは、構成クラスと同じパッケージがスキャンされます.
    @Configuration
    @ComponentScan
    public class CDPlayConfig {
    
    }
    

    テストしたい場合は、次のように書くことができます.
    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(classes=CDPlayConfig.class)
    public class CDPlayerTest {
    
    }
    

    SpringBootテスト
    @RunWith(SpringJUnit4ClassRunner.class)
    @SpringBootTest
    public class Test {
    }
    

    @SpringBootTes
      @SpringBootTest       SpringBoot      bean      。
    

    このときSpringBoot主クラスもbeanのコレクターとして扱われる.前述のCDPlayConfigと同様です.
    SpringBootテスト手順
    テストクラスに直接次の2つの注記@RunWith(SpringRunner.class)@SpringBootTestを付けるとspringのコンテナのインスタンスが取得され、@Autowiredが構成されている場合は自動的にオブジェクトが注入されます.
    具体的なテスト例1
    src/mainでUserServiceクラスを作成し、それをテストするだけで、そのユニットテストクラス(command+shift+Tショートカットキーを使用)を生産し、生成したtestクラスはsrc/testで
    @Service
    public class UserService {
    
        public Integer addUser(String username){
            System.out.println("user dao adduser [username="+username+"]");
            if(username == null){
                return 0;
            }
            return 1;
        }
    }
    

    Springboot起動クラス:
    @SpringBootApplication
    public class Application {
        public static void main(String[] args) {
            SpringApplication.run(Application.class,args);
        }
    }
    

    テストクラス:
    @RunWith(SpringRunner.class)
    @SpringBootTest
    public class UserServiceTest {
    
        @Autowired
        private UserService userService;
    
        @Test
        public void addUser() throws Exception {
            Assert.assertEquals(Integer.valueOf(1),userService.addUser("zhihao.miao"));
            Assert.assertEquals(Integer.valueOf(0),userService.addUser(null));
        }
    
    }
    

    具体的なテスト例2
    スタートアップエントリクラスの作成
    @SpringBootApplication
    public class StartUpApplication {
        public static void main(String[] args) {
            SpringApplication.run(StartUpApplication.class, args);
        }
    }
    
    

    Controllerクラスの作成
    @RestController
    public class HelloController {
    
        @RequestMapping("/")
        public String index() {
            return "Hello Spring Boot,Index!";
        }
    
        @RequestMapping(value = "/test", method = RequestMethod.GET)
        public String test() {
            return "Spring Boot Test Demo!";
        }
    }
    
    
    

    テストクラスの作成
    @RunWith(SpringRunner.class)
    @SpringBootTest(classes = StartUpApplication.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
    public class HelloControllerTest {
    
        /**
         * @LocalServerPort     @Value("${local.server.port}")    
         */
        @LocalServerPort
        private int port;
    
        private URL base;
    
        @Autowired
        private TestRestTemplate restTemplate;
    
        @Before
        public void setUp() throws Exception {
            String url = String.format("http://localhost:%d/", port);
            System.out.println(String.format("port is : [%d]", port));
            this.base = new URL(url);
        }
    
        /**
         *  "/test"      ,       
         * @throws Exception
         */
        @Test
        public void test1() throws Exception {
    
            ResponseEntity response = this.restTemplate.getForEntity(
                    this.base.toString() + "/test", String.class, "");
            System.out.println(String.format("     :%s", response.getBody()));
        }
    
    

    ここで、classes属性は起動クラス、SpringBootTestを指定する.WebEnvironment.RANDOM_PORTは、テストクラス@LocalServerPortとともに属性を注入する際によく使用されます.ポート番号がランダムに生成されます.
    テスト環境でbeanを取得する
    src/mainでインスタンスUserを新規作成
    @Component
    public class User {
    }
    

    src/testでテストクラステストを作成します.
    @RunWith(SpringRunner.class)
    @SpringBootTest
    public class UserTest {
    
    
        @Autowired
        public ApplicationContext context;
    
        @Test
        public void testNotNull(){
            Assert.assertNotNull(context.getBean(User.class));
        }
    }
    

    テスト環境でのみ有効なbean
    src/testで2つのクラスを新規作成し、@TestComponentと@TestConfigurationの2つの注釈修飾をそれぞれ使用することを発見しました.これらのクラスはテスト環境でのみ有効です.
    @TestComponent
    public class Cat {
    
        public void index(){
            System.out.println("cat index");
        }
    }
    
    @TestConfiguration
    public class TestBeanConfiguration {
    
        @Bean
        public Runnable createRunnable(){
            return () -> System.out.println("=====createRunnable=======");
        }
    }
    

    テストクラス:
    @RunWith(SpringRunner.class)
    @SpringBootTest(classes = {TestBeanConfiguration.class,Cat.class})
    public class TestApplication {
    
        @Autowired
        public ApplicationContext context;
    
        @Test
        public void testNotNull(){
            Runnable runnable = context.getBean(Runnable.class);
            runnable.run();
            System.out.println("--------");
    
            Cat cat = context.getBean(Cat.class);
            cat.index();
        }
    }
    

    @SpringBootTest注記のパラメータclassesにパラメータを追加する必要があります.これは、特定のクラスをテスト環境のコンテナに組み込むことを示します.
    参考文献