2017-01-16 50 views
3

考慮方法返回A類在我的服務,有沒有辦法模擬pojo,然後在mockito中手動設置值?

public List<A> method(){ 
A a=B.method_b(); 
List<A> list=new ArrayList<>(); 
for(A aa:a){ 
A classA=new A(); 
classA.setVal1(aa.getVal1()); 
list.add(classA); 
} 
     return list; 
    } 

我的POJO類

class A{ 
private int val1; 
private int val2; 
. 
. 
. 
. 
private int val10; 
//setter and getter 
} 

所以在測試案例中,我這樣寫道

@Mock 
B b; 
@Test 
public void check(){ 
Mockito.when(b.method_b()) 
     .thenReturn(return_A()); 
} 
private A return_A(){ 
A a=new A(); 
a.setVal1(1); 
. 
. 
. 
a.setVal10(10); 
} 

這裏一切工作正常。代碼覆蓋率也很好。但我的問題是,是否有任何可能的方法來避免上面使用mockito返回類A的私有方法?

在單元測試
+0

你不應該需要mockito。只需擴展'B'並重寫'method_b()'以返回您的自定義值。 – shmosel

+0

@shmosel不好主意!什麼ID B是一個接口,並獲得新的方法隨着時間的推移?你總是不得不改變舊的測試... –

+0

不,我只是想避免手動提供setters因爲,即使我錯過了一個setter我的測試用例失敗。 – amjeremiad

回答

3

定義取決於輸入你的類的行爲。 這意味着你必須指定這個輸入。沒有其他辦法了。

有不同的方法來做到這一點。

一個方式,它配置DTO你的方式。

另一種方法是生成輸入數據。但是,這有一些downsites:
- 你仍然需要一個方法(或類)要做到這一點,
- 它使你的測試難以閱讀和理解,
- 它介紹了你的測試失敗的可能性使得它不太可靠,

另一種方式是設置只需要當前測試這些值在您的測試方法的//arrange部分:

@Mock 
B b; 
@Test 
public void check(){ 
    // arrange 
    Mockito.when(b.method_b()) 
     .thenReturn(return_A()); 
    A a=new A(); 
    // values to be used by cut in this test 
    a.setVal1(1); 
    a.setVal3(3); 

    // act 
    // assert 
} 
+0

非常感謝@Timothy Truckle。因此,您說我可以設置當前測試所需的值,並且沒有其他選項可以避免手動設置設置值。 – amjeremiad

+0

@Hemalatha *「所以,你說我可以設置當前測試所需的值」*是的。 - *「並且沒有其他選項可以避免手動設置設置值」*我說「沒有*有用*其他選項...」 –

+0

我明白了。非常感謝你@Timothy Truckle – amjeremiad

相關問題