[英]Not mocking methods, instead calls original methods (mockito)
我要測試的課程。
public class AddNumbers {
public int add(int a, int b){
checkNumbers checkobj=new checkNumbers();
boolean flg = checkobj.check(a, b);
if(flg == true){
return a+b;
}else{
return 0;
}
}
}
這是單元測試用例...
@RunWith(MockitoJUnitRunner.class)
public class AddNumbersTest {
@Mock
checkNumbers checkobj;
@InjectMocks
AddNumbers addobj = new AddNumbers();
@Test
public void testAdd1(){
int a=10;
int b=5;
Mockito.when(checkobj.check(a, b)).thenReturn(true);
assertEquals(addobj.add(a,b),15);
}
}
當我運行此測試用例時,它將調用checkNumbers
類的原始方法,而不是調用checkNumbers
方法。 我通過將Sysout
放在checkNumbers.check()
方法中來了解這一點。
誰能強調我在哪里做錯了。
checkNumbers
是內部創建add
的方法...
checkNumbers checkobj=new checkNumbers();
Mockito注入功能( @InjectMocks
)不能為您填充此功能。
為了讓Mockito將checkNumbers
設置為模擬,您需要允許它被注入。
例如:將其移出add()
並將其聲明為類成員:
private checkNumbers checkobj;
public int add(int a, int b){
boolean flg = checkobj.check(a, b);
if(flg == true){
return a+b;
}else{
return 0;
}
}
當受到@InjectMocks
批注的指示時,Mockito將嘗試通過以下一種方式注入模擬:
如果您將checkNumbers
聲明為類成員,則Mockito將按照上面的#3進行注入。 另外,您可以像這樣聲明一個構造函數...
private checkNumbers checkobj;
public AddNumbers(checkNumbers checkobj) {
this.checkobj = checkobj;
}
...,然后Mockito將按照上面的#1注入模擬實例。
這將具有使您的類在構造時明確需要的任何其他類的好處,並且可以允許您交換checkNumbers
不同實現,從而有助於組成不同形式的AddNumbers
。
在Mockito文檔中有更多詳細信息。
@glytching的先前答案是絕對正確的。
這是覆蓋吸氣方法的其他可能解決方案。
public class AddNumbers {
// This is new method to return a new instance of checkNumbers.
checkNumbers getCheckNumbers() {
return new checkNumbers();
}
public int add(int a, int b){
checkNumbers checkobj = getCheckNumbers();
// do what you need
}
}
您測試覆蓋了getCheckNumbers():
@RunWith(MockitoJUnitRunner.class)
public class AddNumbersTest {
@Mock
checkNumbers checkobj;
@InjectMocks
AddNumbers addobj = new AddNumbers() {
@Override
checkNumbers getCheckNumbers() {
return checkobj;
}
};
@Test
public void testAdd1(){
int a=10;
int b=5;
Mockito.when(checkobj.check(a, b)).thenReturn(true);
assertEquals(addobj.add(a,b),15);
}
}
關於您的代碼的一般說明:
CheckNumbers
。 flg
> flag
。 if(flg == true)
可以簡化為if(flg)
if/esle
構造可以簡化為一種解決方案: return flag ? a + b : 0
return flag ? a + b : 0
testAdd1
> addShouldSumTwoGivenIntegers()
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.