我是Spring Boot的新手,並試圖瞭解如何在SpringBoot中測試。我有點困惑的是以下兩個代碼段之間的區別:使用MockMvc與SpringBootTest和使用WebMvcTest之間的區別
代碼片段:
@RunWith(SpringRunner.class)
@WebMvcTest(HelloController.class)
public class HelloControllerApplicationTest {
@Autowired
private MockMvc mvc;
@Test
public void getHello() throws Exception {
mvc.perform(MockMvcRequestBuilders.get("/").accept(MediaType.APPLICATION_JSON))
.andExpect(status().isOk())
.andExpect(content().string(equalTo("Greetings from Spring Boot!")));
}
}
本次測試使用,我相信是有片測試和@WebMvcTest註釋僅測試Web應用程序的Mvc層。
代碼段2:
@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
public class HelloControllerTest {
@Autowired
private MockMvc mvc;
@Test
public void getHello() throws Exception {
mvc.perform(MockMvcRequestBuilders.get("/").accept(MediaType.APPLICATION_JSON))
.andExpect(status().isOk())
.andExpect(content().string(equalTo("Greetings from Spring Boot!")));
}
}
本試驗採用@SpringBootTest註釋和MockMvc。那麼這和代碼片段1有什麼不同呢?這有什麼不同?
編輯: 添加代碼段3(發現這是Spring文檔中集成測試的例子)
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class HelloControllerIT {
@LocalServerPort
private int port;
private URL base;
@Autowired
private TestRestTemplate template;
@Before
public void setUp() throws Exception {
this.base = new URL("http://localhost:" + port + "/");
}
@Test
public void getHello() throws Exception {
ResponseEntity<String> response = template.getForEntity(base.toString(),
String.class);
assertThat(response.getBody(), equalTo("Greetings from Spring Boot!"));
}
}
非常感謝響應!。因此,如果我理解正確,那麼這意味着這兩個代碼片段僅測試應用程序的MVC部分。但是tcode代碼片段1會加載完整的應用程序上下文,而代碼片段2僅會掃描控制器。它是否正確?代碼段1是否可以被視爲測試控制器的單元測試? – Reshma
不,這是不正確的。 'SpringBootTest'正在加載您的完整應用程序(在某種程度上,默認情況下,如果有可用的,它將不會啓動嵌入式容器,這就是'webEnvironment'的用途)。我不會說'@ SpringBootTest'是控制器的單元測試,但更多的是集成測試。 'WebMvcTest'實際上是對你的控制器的單元測試,因爲如果它有依賴性,你必須自己提供它們(配置或某種模擬)。 –
再次感謝您的回覆。我編輯了這個問題並添加了代碼片段3.您提到@SpringBootTest註釋更多地用於集成測試。我相信Snippet 3展示了這一點。因此,如果像Snippet 3那樣完成集成測試,那麼Snippet 2會做什麼? Snippet 2使用SpringBootTest註釋和一個模擬環境(wenEnvironment屬性的默認值)。此外,代碼片段3啓動嵌入式服務器並進行真正的HTTP調用,而代碼段2不執行此操作。所以考慮到這一點,不能將snippet 2視爲單元測試? – Reshma