我想为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等...)未初始化。
您知道如何解决此问题吗?
4条答案
按热度按时间tzxcd3kk1#
另一个选项是显式创建Spy userRestService
并使用创建的Spys或Mock(根据需要)作为参数
nzkunb0c2#
请执行以下两个步骤来解决问题
1.尝试使用
@Mock
注解而不是@Spy
注解,或者1.从构造函数中移除
@Autowired
注解,因为它是自动注入的。请阅读本文了解更多信息...smdncfj33#
您有两个选项:
1)从字段中删除final声明,以便Mockito可以使用默认构造函数。
2)提供一个无参数的构造函数(只是一个不带任何参数的构造函数),并自己初始化相关字段。
zkure5ic4#
当你在一个没有无参数构造函数的类上使用@Spy时,就会发生这种情况。所以,这意味着你必须传递参数,很可能是mock。你必须同时使用
@Spy
和@InjectMocks
。例如:重要的是,依赖项要按照所需的顺序声明,否则Mockito就没有mock/spy可以注入。