模拟不与@Secured一起使用

Mock not used with @Secured

当我向服务 class 中的任何方法添加 @Secured 并测试服务 class 时,我的模拟没有被提取。当我测试不安全的方法时甚至会发生这种情况。我不明白是否是由于模拟未被使用或被覆盖。

public class Service {

    @Autowired 
    private DAO dao;

    public void method1() {
       ...
       //System.out.println("DEBUG:" + dao.hashCode());
       dao.XXX();
       ...
    }

    @Secured("...") // added second time (Case 2)
    public void method2() {
        ...
        dao.XXX();
        ...
    }
}

public class ServiceTest {

    @Mock
    private DAO dao;

    @InjectMocks
    @Autowired 
    private Service service;

    @Before
    public void beforeTest() {
        MockitoAnnotations.initMocks(this);
    }

    public void testMethod1() {
        Mockito.when(dao.XXX()).thenReturn(...);
        //System.out.println("DEBUG:" + dao.hashCode());
        ...
    }

    public void testMethod2() {
        Mockito.when(dao.XXX()).thenReturn(...);
        ...   
    }
}

案例一: 我在方法 2 上没有 @Secured 的情况下测试方法 1 (testMethod1),一切正常。我的预期结果符合 Mock dao returns.

案例二 我将 @Secured 添加到 method2 并重新 运行 testMethod1。测试完成但结果与 Mock dao 不匹配。实际dao已使用,实际结果与数据库数据匹配

我使用 DEBUG 语句在 ServiceTest class 和服务 class 中打印 dao 的哈希码。在案例 1 中,它们是相同的。在案例 2 中,它们是不同的。

显然,当我添加 @Secured 时发生了一些事情。我想知道那是什么。

假设你使用的是SpringJUnit4ClassRunner,区别可能在于Spring正在围绕你的服务创建一个代理来处理@Secured注解,而Mockito无法处理注入代理中的 dao。

顺便说一句,@Asynchronous@Transactional 和 co.

也会发生同样的情况

我建议使用 MockitoRunner(忘记 Spring),或者,如果您确实需要结合使用 Spring 和 Mockito,请使用 springockito