使用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的常规代码还不错。这只是吸气剂。