【发布时间】: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