1. ホーム
  2. java

Spring Boot Controllerのエンドポイントに対するユニットテストの書き方

2023-08-13 07:53:17

質問内容

以下のようなSpring Bootのサンプルアプリがあります。

Bootメインクラス

@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

コントローラ

@RestController
@EnableAutoConfiguration
public class HelloWorld {
    @RequestMapping("/")
    String gethelloWorld() {
        return "Hello World!";
    }

}

コントローラのユニットテストを書くのに一番簡単な方法は何でしょうか?私は以下を試しましたが、WebApplicationContextの自動配線に失敗していると文句を言われました。

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = DemoApplication.class)
public class DemoApplicationTests {

    final String BASE_URL = "http://localhost:8080/";

    @Autowired
    private WebApplicationContext wac;

    private MockMvc mockMvc;

    @Before
    public void setup() {
        this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build();
    }

    @Test
    public void testSayHelloWorld() throws Exception{

         this.mockMvc.perform(get("/")
                 .accept(MediaType.parseMediaType("application/json;charset=UTF-8")))
                 .andExpect(status().isOk())
                 .andExpect(content().contentType("application/json"));
    }

    @Test
    public void contextLoads() {
    }

}

どのように解決するのですか?

Spring MVCでは standaloneSetup があり、コンテキストを必要としない、比較的単純なコントローラのテストをサポートしています。

MockMvcを構築するには、@Controllerのインスタンスを1つ以上登録し、Spring MVCのインフラをプログラムで設定します。 のインスタンスを登録し、Spring MVCのインフラをプログラム的に設定することで、MockMvcを構築します。これにより コントローラのインスタンス化と初期化を完全に制御することができます。 のインスタンスとその依存関係を完全に制御できるようになり、 単体テストと同様に 一度に一つのコントローラをテストすることができます。

コントローラのテストの例としては、次のような簡単なものがあります。

public class DemoApplicationTests {

    private MockMvc mockMvc;

    @Before
    public void setup() {
        this.mockMvc = MockMvcBuilders.standaloneSetup(new HelloWorld()).build();
    }

    @Test
    public void testSayHelloWorld() throws Exception {
        this.mockMvc.perform(get("/")
           .accept(MediaType.parseMediaType("application/json;charset=UTF-8")))
           .andExpect(status().isOk())
           .andExpect(content().contentType("application/json"));

    }
}