【问题标题】:Mock not used with @Secured模拟不与 @Secured 一起使用
【发布时间】:2015-08-28 20:23:44
【问题描述】:

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

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(...);
        ...   
    }
}

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

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

我使用DEBUG语句打印ServiceTest类和Service类中dao的hashcode。在案例 1 中,它们是相同的。在案例 2 中,它们是不同的。

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

【问题讨论】:

    标签: java spring spring-security mockito


    【解决方案1】:

    假设你使用的是SpringJUnit4ClassRunner,不同的可能是Spring围绕你的Service创建了一个Proxy来处理@Secured注解,而Mockito无法处理代理中dao的注入。

    顺便说一句,@Asynchronous@Transactional 和其他公司也会发生同样的情况。

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-31
    • 2019-08-09
    • 1970-01-01
    • 2017-04-14
    • 1970-01-01
    • 2012-01-12
    相关资源
    最近更新 更多