Easymock和Return(模拟)返回null

时间:2014-02-20 07:03:41

标签: java unit-testing easymock

使用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返回模拟的模板。这有什么不对?

1 个答案:

答案 0 :(得分:2)

原因,如EasyMock documentation中所述:

  

不能嘲笑最终方法。如果被调用,它们的正常代码将被执行。

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

在一天结束时,执行getter的正常代码并不是那么糟糕。这只是一个吸气剂。

相关问题