在测试JUnit中强制私有方法返回值

时间:2017-10-28 01:24:04

标签: java unit-testing junit

我试图测试一个公共方法,该方法调用一个私有方法,该方法返回一个随机整数以在公共方法中使用。

我发现很难写一个测试,因为我的预期出点总是因为随机数生成器而变化。所以我试图让private方法在调用时(在测试中)返回一个指定的值。

这可能吗?

方法:

function func1(fn) { 
    console.log('hello'); 
    fn();
}

func1(function(){ 
    console.log('world');
}); 

测试:

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;
}

1 个答案:

答案 0 :(得分:1)

您通常无法模拟私有方法。 通过声明该方法是私有的,您确保没有人会修改它的行为,测试也不应该这样做。

你可以做的是将随机数生成器移动到作为类的依赖关系传递的供应商,或者作为方法参数,然后可以模拟它。

作为一种可以使用this answer模仿私有方法的PowerMock方法,我个人没有使用它,但我一般认为不应该这样做(因为你要改变私有方式)法)。