最初の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アノテーションを追加しようとしました。
奇妙ですが、@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)と組み合わせて使用する必要があります。