2016-04-21 74 views
0

我有一個有點複雜的過程,我試圖測試。 getDatesMi創建對同一個類中的方法的調用。該方法向接口方法致電 ,該方法將查詢結果轉換爲MarketLimits類型。如何模擬使用EasyMock在測試類中實例化的類?

我正在使用EasyMock和junit。

我的問題是:

  1. 我如何測試getSqlMapClientTemplate()queryForObject?
  2. 我怎麼嘲笑那個getSqlMapClientTemplate()。queryForObject的結果轉換到MarketLimits

我是新來的Java和EasyMock的,所以也許答案是obviuos但任何幫助表示讚賞。

我目前得到的NullPointerException上subDates.greaterThenOne()

接口MyServiceDao

import com.foo.bar.domain.MarketLimits; 

public interface MyServiceDao { 
    public MarketLimits getDates(long orgId) throws DataAccessException; 
} 

類,它實現MyServiceDao

import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport; 
import com.foo.bar.domain.MarketLimits; 


public class myServiceImpl implements MyServiceDao{ 

    @Override 
    public MarketLimits getDates(long orgId) throws DataAccessException { 
     return (MarketLimits) getSqlMapClientTemplate().queryForObject("retrieveLimits", orgId); 
    } 

}

0123被測

import com.foo.bar.dao.MyServiceDao; 

public class myServiceImpl extends reports implements myService { 

    @Autowired 
    private MyServiceDao myServiceDao; 


    public String getDatesMi() throws Exception { 
     MarketLimits subDates = getDates(23); 

     System.out.print(subDates); // this prints out null 

     if(subDates.greaterThenOne()){ 
      // do some things 
     } 

     return "result" 
    } 


    @Override 
    public MarketLimits getDates(long orgId) { 
     return myServiceDao.getDates(orgId); 
    } 


    public setMyServiceDao(MyServiceDao myServiceDao){ 
     this.myServiceDao = myServiceDao 
    } 

} 

MyTest的

@RunWith(EasyMockRunner.class) 
public class myServiceImplTest { 

    @org.easymock.Mock 
    private MyServiceDao myServiceDao; 

    @TestSubject 
    private MyServiceImpl myServiceImpl = new MyServiceImpl(); 

    @Test 
    public void testGetDatesMi() throws Exception { 

     MarketLimits limits = new MarketLimits(); 
     limits.greaterThenOne(true); 
     expect(myServiceDao.getDates()).andReturn(limits); 
     replay(myServiceDao); 

     myServiceImpl.getDatesMi(12); 

    } 
} 

UPDATE 1

出於某種原因EasyMock的實例myServiceDao正在然而創建時的方法是

主類呼籲Ea syMock實例會返回NULL。我的解決方案是在myServiceImpl上創建一個setter方法來設置我的myServiceDao模擬。這是從Deendayal Garg

UPDATE建議2

原來我並不需要有一個setter =) 我改變了標題,以反映我面臨的真正的問題。

+0

我更新了發生空錯誤的位置的問題 – mattwilsn

回答

1

好的。爲了給出更完整的答案,我嘗試了你的代碼。類之間有很多不一致之處。我盡我所能地固定了他們,這裏是一個可行的例子。正如你將會看到的那樣,不需要使用setter來注入Dao。

@RunWith(EasyMockRunner.class) 
public class MyServiceImplTest { 

    @org.easymock.Mock 
    private MyServiceDao myServiceDao; 

    @TestSubject 
    private MyServiceImpl myServiceImpl = new MyServiceImpl(); 

    @Test 
    public void testGetDatesMi() throws Exception { 

     MarketLimits limits = new MarketLimits(); 
     limits.greaterThenOne(true); 
     expect(myServiceDao.getDates(23)).andReturn(limits); 
     replay(myServiceDao); 

     myServiceImpl.getDatesMi(); 

     verify(myServiceDao); 
    } 
} 

public class MarketLimits { 
    private boolean b; 

    public void greaterThenOne(boolean b) { 
     this.b = b; 
    } 

    public boolean greaterThenOne() { 
     return b; 
    } 
} 

public interface MyServiceDao { 
    MarketLimits getDates(long orgId); 
} 

public class MyServiceImpl { 

    private MyServiceDao myServiceDao; 


    public String getDatesMi() throws Exception { 
     MarketLimits subDates = getDates(23); 

     System.out.print(subDates); // this prints out null 

     if(subDates.greaterThenOne()){ 
      // do some things 
     } 

     return "result"; 
    } 

    public MarketLimits getDates(long orgId) { 
     return myServiceDao.getDates(orgId); 
    } 

    public void setMyServiceDao(MyServiceDao myServiceDao){ 
     this.myServiceDao = myServiceDao; 
    } 

} 
+0

感謝您的建議,但調用verify返回此錯誤 java.lang.IllegalStateException:調用驗證不允許在記錄狀態org.easymock.internal.MocksControl.verify(MocksControl。 java:223) \t at org.easymock.EasyMock.verify(EasyMock.java:2007) – mattwilsn

+0

Arg ...對不起。它應該是'replay' – Henri

+0

非常感謝。 – mattwilsn

0

由於您正在測試MyServiceImpl,您可以完全模擬myServiceDao。您需要在MyServiceImpl類中爲myServiceDao設置一個setter。這是Mockito spefici,但同樣可以在EasyMock中完成。

裏面的測試類你cna做類似下面的事情。

@Test 
public void testGetDatesMi() throws Exception { 
    myServiceImpl.setMyServiceDao(myServiceDao);// this is mock 
    when(myServiceDao.getDates(anyLong()).thenReturn(mockMarketLimits); 

    // call you method here 

    // verify 
} 
+0

這是mockito語法。你不需要設置模擬。這將由跑步者自動完成 – Henri

+0

是的。我已經在答案中說過了。 –

+0

是的。但也沒有必要調用setter – Henri

相關問題