18

PowerMock 1.4.7 と JUnit 4.8.2 を使用しています

いくつかの静的メソッドのみをモックする必要があり、他の (同じクラスの) メソッドは元の値を返すだけです。すべての静的メソッドをモックしてmockStatic呼び出さないとwhen().doReturn()、デフォルトが返されます-オブジェクトを返す場合はnull、ブール値を返す場合はfalseなど...など。だから私は thenCallRealMethodデフォルトの実装を返すために各静的メソッドで明示的に使用しようとします(モッキングなし/偽物なしを意味します)が、可能なすべての引数のバリエーションでそれを呼び出す方法がわかりません(=すべての可能な入力呼び出し元のメソッドが必要です)。私は具体的な引数のバリエーションをあざける方法しか知りません。

4

4 に答える 4

31

静的クラスでスパイを使用して、特定のメソッドのみをモックできます。

@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"));
}

}
于 2011-02-21T07:09:06.930 に答える
17

スタブAPIを使用することもできます。

stub(method(MyStaticClass.class, "getB")).toReturn("B");

編集:

これらのパッケージからメソッドを使用stubして静的にインポートするには、次のようにします。method

  1. org.powermock.api.support.membermodification.MemberModifier
  2. org.powermock.api.support.membermodification.MemberMatcher

詳細については、ドキュメントを参照してください

于 2012-01-10T19:25:53.460 に答える
0

この質問に基づいて、PowerMockitoは単一の静的メソッドをモックし、オブジェクトを返します

PowerMockito.mockStatic(MyStaticClass.class);

単独ではすべてのメソッドをモックするわけではなく (少なくとも最近のバージョンの PowerMockito では)、後で個々のメソッドをモックすることのみが可能になります。

于 2019-05-20T01:57:39.867 に答える