无法使用PowerMockito存根静态方法调用

时间:2016-01-13 17:42:36

标签: java unit-testing mockito powermockito

我有一个文件Util.java

public class Util  {
    public static int returnInt() {
        return 1;
    }

    public static String returnString() {
        return "string";
    }
}

另一堂课:

public class ClassToTest {
    public String methodToTest() {
        return Util.returnString();
    }
}

我想使用TestNg和PowerMockito测试它:

@RunWith(PowerMockRunner.class)
@PrepareForTest(Util.class)
public class PharmacyConstantsTest {    
    ClassToTest classToTestSpy;

    @BeforeMethod
    public void beforeMethod() {
        classToTestSpy = spy(new ClassToTest());
    }

    @Test
    public void method() throws Exception {
        mockStatic(Util.class);
        when(Util.returnString()).thenReturn("xyz");
        classToTestSpy.methodToTest();
    }
}

但是,它会引发以下错误:

  

失败:方法   org.mockito.exceptions.misusing.MissingMethodInvocationException:   when()需要一个必须是'对mock进行方法调用'的参数。   例如:       当(mock.getArticles())thenReturn(文章);

我使用网络上的各种解决方案尝试了此解决方案,但无法在我的代码中找到错误。我需要为静态方法存根调用,因为我需要它用于遗留代码。 How do I mock a static method using PowerMockito?

3 个答案:

答案 0 :(得分:1)

您需要将TestNG配置为使用PowerMock对象工厂,如下所示:

<suite name="dgf" verbose="10" object-factory="org.powermock.modules.testng.PowerMockObjectFactory">
    <test name="dgf">
        <classes>
            <class name="com.mycompany.Test1"/>
            <class name="com.mycompany.Test2"/>
        </classes>
    </test>
</suite>

在项目的suite.xml文件中。

请参阅此link

答案 1 :(得分:1)

仅为了记录,添加使测试类成为PowerMockTestCase的子类为我工作。

@PrepareForTest(Util.class)
public class PharmacyConstantsTest extends PowerMockTestCase {    
    ClassToTest classToTestSpy;

    @BeforeMethod
    public void beforeMethod() {
        classToTestSpy = spy(new ClassToTest());
    }

    @Test
    public void method() throws Exception {
        mockStatic(Util.class);
        when(Util.returnString()).thenReturn("xyz");
        classToTestSpy.methodToTest();
     }
 }

答案 2 :(得分:0)

使用PowerMockito方法代替Mockito。文档指出:

  

PowerMockito通过几种新功能扩展了Mockito功能,例如模拟静态和私有方法等等。如果适用,请使用PowerMock而不是Mockito。

每个实例:

PowerMockito.when(Util.returnString()).thenReturn("xyz");