【发布时间】:2014-02-20 22:07:12
【问题描述】:
一位同事试图对两个静态方法编写测试,其中一个静态方法调用另一个。
@RunWith(PowerMockRunner.class)
@PrepareForTest({ ProcessUtil.class, ImageConverter.class })
public class ImageConverterTest {
private static final Logger log = Logger.getLogger(ImageConverterTest.class.getName());
@Test
public void getImageMagicVersion() throws Exception {
PowerMockito.mockStatic(ProcessUtil.class);
PowerMockito.when(
ProcessUtil.execAndReturnResult(Matchers.eq(new String[] { "/usr/bin/convert", "--version" })))
.thenReturn(OLD_IMAGE_MAGIC);
String version = ImageConverter.getImageMagicVersion();
verifyStatic();
ProcessUtil.execAndReturnResult(new String[] { "/usr/bin/convert", "--version" });
log.info("Image magic version: " + version);
assertEquals(version, OLD_IMAGE_MAGIC);
}
}
OLD_IMAGE_MAGIC 是一个静态的最终字符串。
当我们查看ImageConverter.getImageMagicVersion 时,它所做的只是构建字符串数组并将其传递给ProcessUtil.execAndReturnResult。如果ProcessUtil.execAndReturnResult 未被模拟并运行,我预计会出现异常。
ProcessUtil 和 ImageConverter 都不是最终的,它们都是标准类,上面有所有的静态方法。
我们看到的问题是返回的版本是null,但我也可以验证对静态方法的调用是否已完成且正确。当我在测试中调用 ProcessUtil.execAndReturnResult 时,它返回正确的值。
正在使用的 PowerMock 版本是 1.5.4,我们将它与 Mockito(尽管在此代码示例中不相关)和 JUnit 4.11 结合使用。关于我们可能做错了什么会导致这种结果的任何想法?
【问题讨论】:
-
如果它是您要测试的课程,您为什么要嘲笑“ImageConverter”?此外,你准备它来模拟,但你从不模拟它
-
他们不是在嘲笑它,它只是为测试做准备(可能是试图让它发挥作用的一部分),但删除它不会影响结果。
-
这里可能会发生两种情况。 1:“ProcessUtil”类是最终类,因此不可模拟。 2:没有使用这些确切属性调用方法“ProcessUtil.execAndReturnResult”
-
ProcessUtil 不是final,验证成功。如果我扭曲了验证参数,它会失败并给出预期的错误消息。同样,匹配
any(String[].class)也成功。
标签: java unit-testing mockito static-methods powermock