Springboot統合テスト-小例

19418 ワード

環境


MacBook Pro idea:2019.1 Java:1.8 springboot:2.1.4

前言


最近springbootの実戦を見て、第4章 Web -> springMVCを見たとき、本の中について行くと、いつも問題が発生します.ここには次のように記録されています.
@RunWith(SpringJUnit4ClassRunner.class)
 @SpringApplicationConfiguration(
      classes = ReadingListApplication.class)
@WebAppConfiguration
public class MockMvcWebTests {
...

上は本の中の書き方ですが、私の環境では、間違いを報告します.①@SpringApplicationConfigurationspringboot1.5+の時、すでに取り除かれているので、@SpringbootTestを使うべきである.②@WebAppConfiguration私はそれを@AutoConfigureMockMvcに置き換えました.交換しないといつも間違っているからです.

ぶんせき


最初は次のように変更しました。

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = ReadingListController.class)
@WebAppConfiguration
public class MockMvcWebTests {
...

エラーが表示されます.
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'readingListController': Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.misssad.springbootdemo.repository.ReadingListRepository' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}

この間違いは、コンストラクタが必要で、beanを作成することはできませんが、コードにはコンストラクタが注入され、そのコンストラクタがあることです.無参はできないし、無参は依然として間違っている.
および
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.misssad.springbootdemo.repository.ReadingListRepository' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}

この間違いは、コンテキストにはReadingListRepositoryというbeanはありません.ReadingListController類にはReadingListRepositoryが依存しているからです.しかし、このシミュレータはReadingListControllerしかロードされていません.その依存beanはロードされていません.

次のように変更します。

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = ReadingListController.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@WebAppConfiguration
public class MockMvcWebTests {
...

エラー:
java.lang.IllegalStateException: @WebAppConfiguration should only be used with @SpringBootTest when @SpringBootTest is configured with a mock web environment. Please remove @WebAppConfiguration or reconfigure @SpringBootTest

この段落は私が理解していないので、その大まかな意味:
@SpringBootTestが仮想Web環境を構成している場合、@WebAppConfigurationは@SpringBootTestとのみ使用できます.@WebAppConfigurationを削除するか、@SpringBootTestを再構成してください
Web環境なのに、どうしてこの間違いを報告したのか、今のところ分からないの??

次に次のように変更しました。

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = ReadingListController.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@AutoConfigureMockMvc
public class MockMvcWebTests {
...

このようなエラーを報告しました.
Unable to start ServletWebServerApplicationContext due to missing ServletWebServerFactory bean

つまりServletという容器beanは見つかりませんでした.
最後に、@SpringBootTestclassesパラメータを削除すればいいです.つまり、最終コードです.

最終コード


最終コードは(関連コードは貼らないで、springboot .pdfのあちらの本を参考にしています)
import com.misssad.springbootdemo.controller.ReadingListController;
import org.hamcrest.Matchers;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext;

import javax.annotation.Resource;

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@AutoConfigureMockMvc
public class MockMvcWebTests {

    @Autowired
    private WebApplicationContext webContext;

    private MockMvc mockMvc;

    /* MockMvc 
     , 
     */
    @Before
    public void setupMockMvc(){
        mockMvc = MockMvcBuilders.webAppContextSetup(webContext)
                .build();
        System.out.println("------- ------");
    }

    /*① readingList get ;
    * ② (isOK() HTTP200 );
    * ③ readingList;
    * ④ books 
    * ⑤ 
    */
    @Test
    public void homePage() throws Exception {
        mockMvc.perform(MockMvcRequestBuilders.get("/readingList"))
                .andExpect(MockMvcResultMatchers.status().isOk())
                .andExpect(MockMvcResultMatchers.view().name("readList"))
                .andExpect(MockMvcResultMatchers.model().attributeExists("books"))
                .andExpect(MockMvcResultMatchers.model()
                        .attribute("books", Matchers.is(Matchers.empty())));
    }


}

参照先:
https://stackoverflow.com/a/42788074Spring Boot統合テスト