2014-02-20 189 views
0

一个同事试图通过两个静态方法编写测试,其中一个静态方法称为另一个。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。关于我们可能做错的任何想法会导致这种结果?

+0

你为什么要嘲笑'ImageConverter',如果它是你想测试的类?此外,你准备嘲笑它,但你从不嘲笑它 – iberbeu

+0

他们没有嘲笑它,它只是准备测试(可能作为试图让它工作的一部分),但删除不会影响结果。 –

+0

这里可能会发生两件事情。 1:'ProcessUtil'类是final的,因此不可嘲弄。 2:方法'ProcessUtil.execAndReturnResult'没有被这些确切的属性调用 – iberbeu

回答

0

我们确定了这个问题。

PowerMock处理下面的不同:

ProcessUtil.execAndReturnResult(String [] values) 

ProcessUtil.execAndReturnResult(String... values) 

的问题是,我们并没有使用可变参数匹配,而是直阵列中的比赛。切换到可变参数匹配器(或切换到不同的数据类型)解决了这个问题。