Spring boot JUnit5单元测试Get和Post方法
我不熟悉spring引导和Junit测试。我在测试RESTAPI的Get和Post方法时遇到了问题。关于在JUnit测试中使用mockMvc的许多在线教程指南。但是这些对JUnit5仍然有效Spring boot JUnit5单元测试Get和Post方法,spring-boot,unit-testing,spring-mvc,junit5,spring-restcontroller,Spring Boot,Unit Testing,Spring Mvc,Junit5,Spring Restcontroller,我不熟悉spring引导和Junit测试。我在测试RESTAPI的Get和Post方法时遇到了问题。关于在JUnit测试中使用mockMvc的许多在线教程指南。但是这些对JUnit5仍然有效 @ExtendWith(SpringExtension.class) @WebMvcTest(controllers = RegisterRestController.class) class RegisterRestControllerTest { @Autowired private MockM
@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 extension。
由于Junit 5和spring boot都更新了,与以前的版本相比有很多变化,因此很难分析在线可用的关于测试的代码是正确的。
我无法使用MockMvc.perform.andExpectstatus.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 BootJUnit 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
对于集成测试,您不会使用任何模拟。你会有一个真实的数据库,或者至少有一个像h2这样的假数据库。你可以向官方查询。如果您单独测试web层,那么它将不是一个集成测试。