有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java组织。莫基托。例外。基础MockitoException:请确保类型“UserRestService”具有noarg构造函数

我想为RESTAPI创建JUnit5测试

@Test
public void resetRequest_NAME_AND_EMAIL_MISMATCH() throws Exception {
    when(userRestService.resetRequest(anyString(), anyString())).thenReturn(Boolean.valueOf("test"));

    MvcResult result = mockMvc.perform(post("/users/reset_request")
            .contentType(MediaType.APPLICATION_JSON)
            .content(ResetUserDTO))
            .andExpect(status().isBadRequest())
            .andReturn();

    assertEquals(result.getResponse().getContentAsString(), "NAME_AND_EMAIL_MISMATCH");
}

完整代码:Github

但当我运行测试时,我得到了异常

org.mockito.exceptions.base.MockitoException: Unable to initialize @Spy annotated field 'userRestService'.
Please ensure that the type 'UserRestService' has a no-arg constructor.
.....
Caused by: org.mockito.exceptions.base.MockitoException: Please ensure that the type 'UserRestService' has a no-arg constructor.
    ... 68 more

Rest服务代码:GitHub

我试图添加@noargsconstuctor,但我得到警告,变量(UsersService userService、PasswordAdminResetHandler resetHandler等…)未初始化

你知道我如何解决这个问题吗


共 (3) 个答案

  1. # 1 楼答案

    另一个选项是显式创建Spy userRestService

    @Spy
    private UserRestService userRestService = new UserRestService(...);
    

    并使用创建的间谍或模拟(根据需要)作为参数

  2. # 2 楼答案

    请执行以下两个步骤来解决问题

    1. 尝试使用@Mock注释而不是@Spy注释 或者
    2. 从构造函数中删除自动注入的@Autowired注释Read this for more information ...
  3. # 3 楼答案

    你有两个选择:

    1)从字段中删除最终声明,以便默认构造函数可供Mockito使用

    2)提供一个无参数构造函数(只是一个不带任何参数的构造函数),并自己初始化有问题的字段