java - 无法调用由 MethodValidationPostProcessor 代理的模拟方法 verify()
问题描述
我有一个简单的服务接口:
@Service
@Validated
public interface UserService
{
void createUser (@Email String userEmail);
void refreshUsers ();
}
我想测试两件事UserService
:
- 验证注释
@Email
正在工作。 - 方法的调用
refreshUsers()
可以通过 来验证verify()
。
因此,我创建了以下测试用例SpringJUnit4ClassRunner
:
@RunWith(value = SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = UserServiceTest.TestConfig.class)
public class UserServiceTest
{
@Configuration
public static class TestConfig
{
@Bean
public UserService userService ()
{
return mock(UserService.class);
}
@Bean
public MethodValidationPostProcessor methodValidationPostProcessor ()
{
return new MethodValidationPostProcessor();
}
}
@Autowired
private UserService userService;
@Test
public void createUserWithValidEmail ()
{
userService.createUser("aaa@example.com");
}
@Test
public void createUserWithInvalidEmail ()
{
assertThatThrownBy(() -> userService.createUser("aaa"))
.isInstanceOf(ConstraintViolationException.class);
}
@Test
public void refreshUsersCalled1 ()
{
userService.refreshUsers();
verify(userService).refreshUsers();
}
@Test
public void refreshUsersCalled2 ()
{
userService.refreshUsers();
verify(userService).refreshUsers();
}
测试用例refreshUsersCalled2()
将失败并显示以下消息:
此处缺少验证(模拟)的方法调用: -> 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 正确验证示例: 验证(模拟).doSomething() 此外,此错误可能会出现,因为您验证了以下任一方法:final/private/equals()/hashCode() 方法。 这些方法*不能*被存根/验证。 不支持在非公共父类上声明的模拟方法。
但是,该方法refreshUsers()
不是 final/private/equals()/hashCode() 方法之一。
经过一番调查,我发现问题来自 和 之间的mock()
冲突MethodValidationPostProcessor
。
如果我从中删除MethodValidationPostProcessor
Spring bean TestConfig
,上述问题将得到解决。但是,测试用例createUserWithInvalidEmail
将失败,因为验证机制消失了。
有什么方法可以同时测试验证和verify()
同一个测试吗?
完整示例位于https://github.com/johnlinp/misc-demo/tree/master/mockito-with-validation-in-spring-test。
解决方案
推荐阅读
- html - 增加浏览器的默认字体大小是如何工作的?
- android - 使用 Rx java 时 api 请求重复
- alexa - 如何在自定义 Alexa 技能中禁用某些意图?
- python - 将两个数据框行合并为一个
- python - 骰子实验结果的分布
- api - Acumatica SOAP Contract API-BusinessAccountPaymentInstructionDetail for Vendor Add
- visual-studio - 具有指向和单击运动的动画 [Unity2D]
- testing - 通过使用 grep 过滤运行测试不起作用
- reactjs - 如何将数组声明为任何:使用 UseState 挂钩时?
- flutter - Flutter:动态地将值添加到复杂的地图中