JUnit 5单元测试Get和Post方法

问题描述 投票:0回答:1

我是一个新来的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文档对我来说没有帮助)。

spring-boot unit-testing spring-mvc junit5 spring-restcontroller
1个回答
0
投票

你可以使用 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这样的 "假数据库"。

© www.soinside.com 2019 - 2024. All rights reserved.