PowerMock静态方法调用静态方法

时间:2014-02-20 22:07:12

标签: java unit-testing mockito static-methods 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没有被模拟并运行,我期待一个例外。

ProcessUtilImageConverter都不是最终的,它们都是标准类,其上包含所有静态方法。

我们看到的问题是返回的版本是null,但我还可以验证静态方法上的调用是否正确完成。当我在测试中调用ProcessUtil.execAndReturnResult时,它返回正确的值。

正在使用的PowerMock版本是1.5.4,我们将它与Mockito(虽然这在此代码示例中无关)和JUnit 4.11一起使用。关于我们可能做错什么的任何想法会导致这种结果?

1 个答案:

答案 0 :(得分:0)

我们确定了问题。

PowerMock将以下内容视为不同:

ProcessUtil.execAndReturnResult(String [] values)

ProcessUtil.execAndReturnResult(String... values)

问题是我们没有使用varArg匹配器,而是使用直接数组匹配。切换到vararg匹配器(或切换到不同的数据类型)解决了问题。