web-dev-qa-db-ja.com

Spring Boot MVCテスト-MockMvcは常にnullです

最初のSpring MVCテストを記述しようとしていますが、Spring BootでMockMvc依存関係をテストクラスに挿入できません。これが私のクラスです:

@WebMvcTest
public class WhyWontThisWorkTest {

  private static final String myUri = "uri";
  private static final String jsonFileName = "myRequestBody.json";

  @Autowired
  private MockMvc mockMvc;

  @Test
  public void iMustBeMissingSomething() throws Exception {
    byte[] jsonFile = Files.readAllBytes(Paths.get("src/test/resources/" + jsonFileName));
    mockMvc.perform(
        MockMvcRequestBuilders.post(myUri)
            .content(jsonFile)
            .contentType(MediaType.APPLICATION_JSON))
        .andExpect(MockMvcResultMatchers.status().is2xxSuccessful());
  }
}

IntelliJのデバッガーを確認したところ、mockMvc自体がnullであることを確認できました。したがって、すべての例外メッセージは「Java.lang.NullPointerException」であることを教えてくれます。

"@SpringBootTest"や "@RunWith(SpringRunner.class)"などのテストクラスに、Springの初期化に関係があるが運が悪い場合に備えて、より一般的なSpring Bootアノテーションを追加しようとしました。

6
ElDuderino

奇妙ですが、@RunWith(SpringRunner.class)@SpringBootTest@AutoConfigureMockMvcアノテーション?以下のサンプルは正常に動作しています。

@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
public class HelloControllerTest {

    @Autowired
    private MockMvc mockMvc;

    @Test
    public void getHello() throws Exception {
        mockMvc.perform(MockMvcRequestBuilders.get("/").accept(MediaType.APPLICATION_JSON))
                .andExpect(status().isOk())
                .andExpect(content().string(equalTo("Hello World of Spring Boot")));
    }
}

完全なサンプル ここ

Springのドキュメント で詳しく説明されている@WebMvcTestおよび@AutoConfigureMockMvcアノテーションの使用に関する次のコメントを検討することも価値があります。

デフォルトでは、@ WebMvcTestで注釈が付けられたテストは、Spring SecurityおよびMockMvcも自動構成します(HtmlUnit WebClientおよびSelenium WebDriverのサポートを含みます)。 MockMVCをよりきめ細かく制御するには、@ AutoConfigureMockMvcアノテーションを使用できます。

通常、@ WebMvcTestは、@ MockBeanまたは@Importと組み合わせて使用​​され、@ Controller Beanが必要とするコラボレーターを作成します。

アプリケーション構成全体をロードしてMockMVCを使用する場合は、このアノテーションではなく、@ SpringBootTestと@AutoConfigureMockMvcの組み合わせを検討する必要があります。

JUnit 4を使用する場合、このアノテーションは@RunWith(SpringRunner.class)と組み合わせて使用​​する必要があります。

3
alainlompo