我使用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会以某种方式干扰过滤方法吗?