我是一个新来的spring boot和Junit测试的人,我在测试Rest Api的Get和Post方法时遇到了问题。我在测试Rest Api的Get和Post方法时遇到了问题。网上有很多关于在JUnit测试中使用mockMvc的教程。但这些对JUnit 5还有效吗。
@ExtendWith(SpringExtension.class)
@WebMvcTest(controllers = RegisterRestController.class)
class RegisterRestControllerTest {
@Autowired
private MockMvc mockMvc;
@Autowired
private ObjectMapper objectMapper;
@MockBean
private RegisterUseCase registerUseCase;
@Test
void whenValidInput_thenReturns200() throws Exception {
mockMvc.perform(...);
}
}
但是我读到一篇文章,说从SpringBoot 2.1开始你就不需要包含@ExtendWith扩展了,因为Junit 5和Spring Boot都更新了很多以前的版本,所以很难分析网上哪些代码是正确的测试。我无法使用MockMvc.perform().andExpect(status().isOk())。
mockMvc.perform(post("/forums/{forumId}/register", 42L)
.contentType("application/json")
.param("sendWelcomeMail", "true")
.content(objectMapper.writeValueAsString(user)))
.andExpect(status().isOk());
测试Get和post方法的正确用法是什么。测试Rest动词是属于单元测试还是集成测试?
另外,请指导我如何使用Spring Boot查看Junit 5的更新特性(JUnit 5文档对我来说没有帮助)。
你可以使用 MockMvcRequestBuilders
内的单元测试。下面是一个关于post的例子。
@ExtendWith(SpringExtension.class)
@WebMvcTest(RegisterRestController.class)
@AutoConfigureMockMvc(addFilters = false) //for disabling secruity, remove if not needed
class RegisterRestControllerTest {
@MockBean
private MyService myService;
@Autowired
private ObjectMapper objectMapper;
@Autowired
private MockMvc mockMvc;
@Test
void someTest() {
// mock post of new User
when(myService.createPojo(User.class)))
.thenAnswer((Answer<User>)
invocationOnMock -> invocationOnMock.getArgument(0, User.class));
// test post request with data
mockMvc.perform(MockMvcRequestBuilders
.post("/forums/{forumId}/register", 42L)
.contentType("application/json")
.param("sendWelcomeMail", "true")
.content(objectMapper.writeValueAsString(user)))
.andExpect(status().isOk())
.andExpect(jsonPath("$.name").value("some name"));
}
同样,你也可以测试GET,PUT和DELETE。希望这能帮助你进入测试你的控制器。
回答单元与集成测试部分。在这种情况下,你是在测试一个单元,控制器。处理事务的服务和所有其他层都是被模拟的,例如在我的例子代码中使用mockito。
对于一个集成测试,你不会使用任何mock。你会有一个真正的数据库,或者至少有一个像h2这样的 "假数据库"。