首页 > 解决方案 > 无法调用由 MethodValidationPostProcessor 代理的模拟方法 verify()

问题描述

我有一个简单的服务接口:

@Service
@Validated
public interface UserService
{
    void createUser (@Email String userEmail);

    void refreshUsers ();
}

我想测试两件事UserService

  1. 验证注释@Email正在工作。
  2. 方法的调用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

如果我从中删除MethodValidationPostProcessorSpring bean TestConfig,上述问题将得到解决。但是,测试用例createUserWithInvalidEmail将失败,因为验证机制消失了。

有什么方法可以同时测试验证和verify()同一个测试吗?

完整示例位于https://github.com/johnlinp/misc-demo/tree/master/mockito-with-validation-in-spring-test

标签: javavalidationtestingmockitospring-test

解决方案


推荐阅读