使用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返回模拟的模板。这有什么不对?
答案 0 :(得分:2)
原因,如EasyMock documentation中所述:
不能嘲笑最终方法。如果被调用,它们的正常代码将被执行。
恰好HibernateDaoSupport#getHibernateTemplate()
是final
。由于我无法更改方法签名,因此我能做的最好的事情就是为此类提取接口。或者,我可以使用Powermock,如this answer中所述。
在一天结束时,执行getter的正常代码并不是那么糟糕。这只是一个吸气剂。