【问题标题】:@PrepareForTest, @RunWith and lambda expressions@PrepareForTest、@RunWith 和 lambda 表达式
【发布时间】:2017-07-04 08:44:50
【问题描述】:

今天我正在调试一个相当大的测试用例,其中涉及大量 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 模拟。

所以,最终我的问题是:

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

【问题讨论】:

  • 附带说明:Whitebox 是一个“内部”类;你会注意到当更新到最新版本的 Mockito 时(因为那个类已经不在了)。但是很遗憾,您不会更新到最新的、更有趣的 Mockito 版本,因为 PowerMock 不适用于任何 不错的最新 版本的 Mockito。完全题外话:但是当您想避免此类问题时:尝试摆脱 PowerMock。除非您使用它来测试第 3 方代码,否则没有理由使用它。 您需要 PowerMock 的所有东西都可以在没有它的情况下进行测试 - 当您修复损坏的设计时 ;-)
  • 你试过用'spy'代替'mock'吗?
  • 还有一个问题:您使用哪个版本的 PowerMock?莫基托?

标签: java unit-testing lambda mockito powermock


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2016-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-27
    • 2011-06-19
    • 1970-01-01
    相关资源
    最近更新 更多