2017-04-10 25 views
0

有很多問題已經提出,但對於我的特殊情況沒有真正有用的信息。測試修改模擬類的字段的方法

我想測試一個方法,它在A類中,它是一個void,它調用一些來自B類的方法,然後修改或檢查它的字段 - 多個。

下面是一個例子:

public class A { 
private B b; 

public A(B b){ 
    this.b = b; 
} 

public void checkStageOne(Worksheet ws){ 
    if(long statement){ 
     if(B.checkStorage(ws)){ 
      ws.setThing("Nasty"); 
     } 
     else { ws.setStatus("Not so nasty"); } 
    } 
} 

讓說的LinkedLists在某種程度上填補了。 A類checkStageOne()的參數包含在列表中的B類

public class B { 
private LinkedList<Worksheet> sheetList = new LinkedList<>(); 
private LinkedList<UsedParts> upList = new LinkedList<>(); 
private LinkedList<UsedParts> matList = new LinkedList<>(); 


public boolean checkStorage(int id){ 
    for(UsedParts up : upList){ 
     if(up.getSheetID()== id){ 
      for(Material mat : matList){ 
       if(up.getMatID() == mat.getMatID()){ 
        if(mat.getQuantity() - up.getQuantityNeeded() < 0){ 
         return false; 
        } 
       } 
      } 
     } 
    } 
    return true; 
} 

我想嘲笑B類,但我完全不知道我怎麼會假B的字段,然後甚至測試結果在他們。我所知道的是,我可以用EasyMock.expectLastCall()來測試一個void。但是接下來我需要檢查它是否確實使用了斷言。

你有什麼建議嗎?

VBR, assaultpig

+0

可以爲B中接受3個linkedLists,然後使用創建的Mockito爲B的測試實例創建構造函數: LinkedList的mock1 =模擬(LinkedList.class); LinkedList mock2 = mock(LinkedList.class); LinkedList mock3 = mock(LinkedList.class); new B(mock1,mock2,mock3); 然後,你可以檢查是否有與這些嘲笑的互動 –

+0

謝謝,這是一個好主意。你知道如何檢查EasyMock嗎? – assaultpig

回答

0

要回答你對此有何評論,你做了EasyMock同樣的事情。

但是我想嘲笑B,那麼,那不是你應該做的。只是模擬B。那麼,你只關心checkStorage返回truefalse來測試A

事情是這樣的:

B b = mock(B.class); 
Worksheet ws = mock(Worksheet.class); 
A a = new A(b); 
expect(b.checkStorage()).andReturn(true); // expect one call to checkStorage to return true 
ws.setThing("Nasty"); // expect setThing to be called 

replay(b, ws); 

a.checkStageOne(ws); // will call checkStorage that will return true 

verify(b, ws); // will make sure setThing was called