【问题标题】:PowerMock where static methods call static methods静态方法调用静态方法的 PowerMock
【发布时间】: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 未被模拟并运行,我预计会出现异常。

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

我们看到的问题是返回的版本是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


【解决方案1】:

我们确定了问题。

PowerMock 将以下内容视为不同:

ProcessUtil.execAndReturnResult(String [] values)

ProcessUtil.execAndReturnResult(String... values)

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

【讨论】:

    猜你喜欢
    • 2019-07-26
    • 1970-01-01
    • 1970-01-01
    • 2019-10-28
    • 1970-01-01
    • 2016-04-23
    • 1970-01-01
    • 1970-01-01
    • 2013-03-20
    相关资源
    最近更新 更多