我是Spring Boot的新手,正在尝试了解SpringBoot中的测试工作原理。我对以下两个代码片段之间的区别感到有点困惑:
代码片段1:
@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!"));
}
}
发布于 2016-10-05 16:36:52
@SpringBootTest
是通用的测试注释。如果你正在寻找在1.4之前做同样事情的东西,那就是你应该使用的。它根本不使用切片,这意味着它将启动您的整个应用程序上下文,并且根本不定制组件扫描。
@WebMvcTest
只会扫描你定义的控制器和MVC基础设施。就这样。因此,如果您的控制器对服务层中的其他bean有一些依赖关系,则在您自己加载该配置或为其提供模拟配置之前,测试将不会开始。这要快得多,因为我们只加载了你的应用程序的一小部分。此注释使用切片。
Reading the doc可能也会对您有所帮助。
https://stackoverflow.com/questions/39865596
复制相似问题