一个同事试图通过两个静态方法编写测试,其中一个静态方法称为另一个。PowerMock静态方法调用静态方法
@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',如果它是你想测试的类?此外,你准备嘲笑它,但你从不嘲笑它 – iberbeu
他们没有嘲笑它,它只是准备测试(可能作为试图让它工作的一部分),但删除不会影响结果。 –
这里可能会发生两件事情。 1:'ProcessUtil'类是final的,因此不可嘲弄。 2:方法'ProcessUtil.execAndReturnResult'没有被这些确切的属性调用 – iberbeu