Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring boot JUnit5单元测试Get和Post方法_Spring Boot_Unit Testing_Spring Mvc_Junit5_Spring Restcontroller - Fatal编程技术网

Spring boot JUnit5单元测试Get和Post方法

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

我不熟悉spring引导和Junit测试。我在测试RESTAPI的Get和Post方法时遇到了问题。关于在JUnit测试中使用mockMvc的许多在线教程指南。但是这些对JUnit5仍然有效

@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层,那么它将不是一个集成测试。