2014-02-20 42 views
1

使用EasyMock 3.2,我有一个测试,基本上与我下面的测试相同。当我运行这个测试时,SUT试图执行时有一个空指针异常daoSupport.getHibernateTemplate().loadAll();当模拟daoSupport应该返回模拟模板时,它返回nullEasymock和Return(模拟)返回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能够返回模拟模板。这里有什么问题?

回答

2

的原因,如discribed在EasyMock documentation

Final方法不能被嘲笑。如果被调用,他们的普通代码将被执行。

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

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

+0

奇怪的是,在这种情况下EasyMock“默默地失败”...... Mockito抛出一个异常。 – fge