簡體   English   中英

在測試 JUnit 中強制私有方法返回值

[英]Forcing private method return value in test JUnit

我正在嘗試測試一個公共方法,該方法調用一個私有方法,該方法返回一個隨機整數以在公共方法中使用。

我發現很難編寫測試,因為由於隨機數生成器,我的預期輸出點總是與我的結果不同。 所以我試圖讓私有方法在調用時返回一個指定的值(在測試中)。

這可能嗎?

方法:

public String addLine(String arrayString){
    String[] numbers = arrayString.split(",");
    int startingSize = numbers.length;

    int newLineCounter = generateLineSpacing(startingSize);

    for (int index  =0;index <numbers.length; index++ ,newLineCounter--){
        if (newLineCounter == 0){
            numbers[index] = "\n," + numbers[index];
            newLineCounter = generateLineSpacing(startingSize);
        }
    }
    return StringUtils.arrayToCommaDelimitedString(numbers);
}


private int generateLineSpacing(int sizeOfArray) {
    Random random = new Random();

    //odd +1
    if (sizeOfArray % 2 == 1){
        sizeOfArray += 1;
    }

    //create new line in random position within range 1 - half array size
    return random.nextInt(sizeOfArray/2  -1 ) + 1;
}

測試:

@Test
public void shouldAddSymbolAtNewLineLocation(){
    //given
    String expected = "2,3,\n,4";
    String startingString = "2,3,4";

    //mock out random number generator to return 2

    //when
    String result = underTest.addLine(startingString);

    //then
    assertEquals(expected, result);
}

您通常不能模擬私有方法。 通過將方法聲明為私有,您可以確保沒有人會修改其行為,測試也不應該這樣做。

您在這里可以做的是將隨機數生成器移動到作為類的依賴項或作為方法參數傳遞的供應商中,然后可以對其進行模擬。

作為替代方案, 這個答案認為您可以使用PowerMock來模擬私有方法,我個人沒有使用過它,但我通常認為不應該這樣做(再次因為您正在更改私有方法)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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