簡體   English   中英

不是模擬方法,而是調用原始方法(mockito)

[英]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將嘗試通過以下一種方式注入模擬:

  1. 構造器注入
  2. 二傳手注射
  3. 資產注入

如果您將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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM