本文介绍了PowerMock:模拟静态方法(+在某些特定方法中返回原始值)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用PowerMock 1.4.7和JUnit 4.8.2

I use PowerMock 1.4.7 and JUnit 4.8.2

我只需要模拟一些静态方法而我需要其他方法(来自
同类)只是为了返回原始值。
当我用 mockStatic 模拟时,不要在()时执行 .doReturn()所有
静态方法返回它们的默认值 - 如返回Object
时返回null或返回boolean时返回false等等。所以我尝试在每个静态方法上显式使用
thenCallRealMethod 来返回
默认实现(意味着没有模拟/没有假货)但我不知道
如何在每个可能的参数变量上调用它(=我希望每个可能的输入调用原始方法)。我只知道如何模拟具体的参数变化。

I need to mock only some static methods and I want others (from thesame class) just to return original value.When I mock with mockStatic and don't call when().doReturn() allstatic methods return their defaults - like null when returning Objector false when returning boolean...etc. So I try to usethenCallRealMethod explicitly on each static method to returndefault implementation (means no mocking/ no fakes) but I don't knowhow to call it on every possible arguments variations (= I want for every possible input call original method). I only know how to mock concrete argument variation.

推荐答案

您可以在静态类上使用间谍并仅模拟特定方法:

You can use a spy on your static class and mock only specific methods:

@RunWith(PowerMockRunner.class)
@PrepareForTest(MyStaticTest.MyStaticClass.class)
public class MyStaticTest {

public static class MyStaticClass {
    public static String getA(String a) {
        return a;
    }
    public static String getB(String b) {
        return b;
    }
}

@Test
public void should_partial_mock_static_class() throws Exception {
    //given
    PowerMockito.spy(MyStaticClass.class);
    given(MyStaticClass.getB(Mockito.anyString())).willReturn("B");
    //then
    assertEquals("A", MyStaticClass.getA("A"));
    assertEquals("B", MyStaticClass.getA("B"));
    assertEquals("C", MyStaticClass.getA("C"));
    assertEquals("B", MyStaticClass.getB("A"));
    assertEquals("B", MyStaticClass.getB("B"));
    assertEquals("B", MyStaticClass.getB("C"));
}

}

这篇关于PowerMock:模拟静态方法(+在某些特定方法中返回原始值)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-14 08:02