2014-02-20 43 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