@PrepareForTest,@ RunWith和lambda表达式

时间:2017-02-15 15:34:16

标签: java unit-testing lambda mockito powermock

今天我正在调试一个涉及大量whenNew模拟的巨大测试用例。

最后,归结为使用@PrepareForTest@RunWith注释与PowerMock似乎不会在正在测试的类中执行lambda表达式这一事实。

以下是显示问题的示例:

public class Solution {
    private int[] arr;

    void fillArray() {
        IntStream.range(0, arr.length).forEach(i -> arr[i] = i);
    }
}

还有一个测试类:

@PrepareForTest(Solution.class)
@RunWith(PowerMockRunner.class)
public class SolutionTest {
    @Test
    public void test() {
        int[] arr = new int[5];
        Solution solutionMock = mock(Solution.class);
        Whitebox.setInternalState(solutionMock, "arr", arr);
        doCallRealMethod().when(solutionMock).fillArray();

        solutionMock.fillArray();

        for (int i = 0; i < 5; i++) {
            assertEquals(i, arr[i]);
        }
}

在前面的示例中,fillArray方法内的lambda表达式永远不会被调用,测试失败。删除SolutionTest上的其中一个注释(或两者)会使测试通过,但它不是真正的解决方案,因为我想做一些whenNew模拟。

所以,最终我的问题是:

是否有任何解决方案或至少可行的解决方法或修复上述问题?

1 个答案:

答案 0 :(得分:0)

此测试通过PowerMock 1.6.6和Mockito 1.10.19。确保您的版本已升级。