使用EasyMock 3.2,我进行的测试与下面的测试基本相同。当我运行此测试时,当SUT尝试执行daoSupport.getHibernateTemplate().loadAll();时,将出现空指针异常。当模拟的daoSupport应该返回模拟的模板时,它将返回null

@RunWith(EasyMockRunner.class)
public class DAOImplTest extends EasyMockSupport {
    @Mock
    private HibernateDaoSupport daoSupport;
    @Mock
    private HibernateTemplate template;

    @Test
    public void test() {
        expect(daoSupport.getHibernateTemplate()).andReturn(template).once(); //1
        expect(template.loadAll()).andReturn(Collections.emptyList()).once(); //2
        replayAll();

        SUT mySUT = new SUT(daoSupport);
        mySUT.exercise();
        verifyAll();
    }
}


我可以通过将上面代码段中的//1替换为此处来使测试工作

daoSupport.setHibernateTemplate(template);


显然这不是我想要的。我希望模拟的daoSupport返回模拟的模板。怎么了

最佳答案

原因,如EasyMock documentation中所述:


  最终方法不能被模拟。如果调用,将执行其常规代码。


恰好是HibernateDaoSupport#getHibernateTemplate()final。由于我无法更改方法签名,因此我能做的最好的事情就是为此类提取接口。或者,我可以使用Powermock,如this answer中所述。

归根结底,执行getter的常规代码还不错。这只是吸气剂。

10-08 02:24