junit org.mockito.exceptions.base.MockitoException:请确保类型“UserRestService”具有无参数构造函数

bsxbgnwa  于 2022-11-24  发布在  其他
关注(0)|答案(4)|浏览(228)

我想为Rest API创建JUnit 5测试。

@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

休息服务代码:GitHub
我尝试添加@NoArgsConstructor,但收到警告:变量(用户服务userService、密码管理员重置处理程序resetHandler等...)未初始化。
您知道如何解决此问题吗?

tzxcd3kk

tzxcd3kk1#

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

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

并使用创建的Spys或Mock(根据需要)作为参数

nzkunb0c

nzkunb0c2#

请执行以下两个步骤来解决问题
1.尝试使用@Mock注解而不是@Spy注解,或者
1.从构造函数中移除@Autowired注解,因为它是自动注入的。请阅读本文了解更多信息...

smdncfj3

smdncfj33#

您有两个选项:
1)从字段中删除final声明,以便Mockito可以使用默认构造函数。
2)提供一个无参数的构造函数(只是一个不带任何参数的构造函数),并自己初始化相关字段。

zkure5ic

zkure5ic4#

当你在一个没有无参数构造函数的类上使用@Spy时,就会发生这种情况。所以,这意味着你必须传递参数,很可能是mock。你必须同时使用@Spy@InjectMocks。例如:

@Mock
MyMockClass2 mock1;
@Mock
MyMockClass2 mock2;
@Spy
@InjectMocks
MySpiedClass spy;

重要的是,依赖项要按照所需的顺序声明,否则Mockito就没有mock/spy可以注入。

相关问题