一位同事试图用两种静态方法编写测试,其中一种静态方法称为另一种静态方法。
@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一起使用。关于我们可能做错什么的任何想法会导致这种结果?
答案 0 :(得分:0)
我们确定了问题。
PowerMock将以下内容视为不同:
ProcessUtil.execAndReturnResult(String [] values)
和
ProcessUtil.execAndReturnResult(String... values)
问题是我们没有使用varArg匹配器,而是使用直接数组匹配。切换到vararg匹配器(或切换到不同的数据类型)解决了问题。