Java 8 filter()似乎无法在使用PowerMockito

时间:2017-12-15 17:10:17

标签: java intellij-idea powermockito

我使用Stream API来确定列表中有多少项符合特定条件,但是当我尝试对其进行单元测试时,它会失败。

更具体地说,我在静态方法中使用Stream API,我使用PowerMockito静态模拟类,但我已经将相关方法配置为在调用时正常运行。

作为一个简单的例子(我已经能够重现这个问题),让我说我有一个名为TestStream的类,它有两个静态方法:numPositive,它接受一个整数列表并返回有多少是积极的,而methodToBeMocked,将在测试中被嘲笑。

import java.util.List;

public class TestStream {

    public static int numPositive(List<Integer> nums) {
        return (int) nums.stream().filter(num -> num > 0).count();
    }

    public static int methodToBeMocked(int arg) {
        return arg * 2;
    }
}

然后我有以下测试类:

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;

import java.util.Arrays;
import java.util.List;

import static org.junit.Assert.assertEquals;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyInt;

@RunWith(PowerMockRunner.class)
@PrepareForTest({ TestStream.class })
public class TestStreamTest {

    @Before
    public void setup() {
        PowerMockito.mockStatic(TestStream.class);
        PowerMockito.when(TestStream.numPositive(any())).thenCallRealMethod();
        PowerMockito.when(TestStream.methodToBeMocked(anyInt())).thenReturn(-1);
    }

    @Test
    public void testNumPositive() {
        List<Integer> nums = Arrays.asList(1, -1, 14, 7, -5);
        assertEquals(3, TestStream.numPositive(nums));
    }
}

当我运行测试时,断言失败,表示实际返回值为零。但是,当我在使用IntelliJ进行调试时逐步执行代码并使用numPositive方法时,如果我使用调试器计算表达式,则得到3,这是我所期望的。

为什么在调试和运行测试时评估表达式会得到不同的结果? PowerMockito会以某种方式干扰过滤方法吗?

0 个答案:

没有答案