Java 8 filter()不';t似乎在课堂上用PowerMockito模拟了部分静态

Java 8 filter()不';t似乎在课堂上用PowerMockito模拟了部分静态,java,intellij-idea,powermockito,Java,Intellij Idea,Powermockito,我正在使用流API来确定列表中有多少项满足特定条件,但当我尝试对其进行单元测试时,它失败了 更具体地说,我在一个静态方法中使用流API,我使用PowerMockito静态模拟该方法的类,但我已将该方法配置为在调用时正常运行 作为一个简单的例子(在这个例子中,我能够重现这个问题),假设我有一个名为TestStream的类,它有两个静态方法:numPositive,它接受一个整数列表并返回多少个正整数;methodToEmocked,它将在测试中被模拟 import java.util.List;

我正在使用流API来确定列表中有多少项满足特定条件,但当我尝试对其进行单元测试时,它失败了

更具体地说,我在一个静态方法中使用流API,我使用PowerMockito静态模拟该方法的类,但我已将该方法配置为在调用时正常运行

作为一个简单的例子(在这个例子中,我能够重现这个问题),假设我有一个名为TestStream的类,它有两个静态方法:numPositive,它接受一个整数列表并返回多少个正整数;methodToEmocked,它将在测试中被模拟

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 java.util.List;
公共类测试流{
公共静态int numPositive(列表nums){
return(int)nums.stream().filter(num->num>0.count();
}
公共静态int-methodToBeMocked(int-arg){
返回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));
    }
}
import org.junit.Before;
导入org.junit.Test;
导入org.junit.runner.RunWith;
导入org.powermock.api.mockito.PowerMockito;
导入org.powermock.core.classloader.annotations.PrepareForTest;
导入org.powermock.modules.junit4.PowerMockRunner;
导入java.util.array;
导入java.util.List;
导入静态org.junit.Assert.assertEquals;
导入静态org.mockito.Matchers.any;
导入静态org.mockito.Matchers.anyInt;
@RunWith(PowerMockRunner.class)
@PrepareForTest({TestStream.class})
公共类TestStreamTest{
@以前
公共作废设置(){
mockStatic(TestStream.class);
when(TestStream.numPositive(any()).thenCallRealMethod();
when(TestStream.methodToBeMocked(anyInt())。然后返回(-1);
}
@试验
public void testNumPositive(){
List nums=Arrays.asList(1,-1,14,7,-5);
assertEquals(3,TestStream.nummpositive(nums));
}
}
当我运行测试时,断言说实际返回值为零而失败。但是,当我在使用IntelliJ进行调试时单步执行代码并使用numPositive方法时,如果我使用调试器计算表达式,则得到3,这是我所期望的


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

上面的代码适合我