4

これは、ここにあるのと同じ質問です。残念ながら、受け入れられた答えは私にとってはうまくいきません。テストする必要があるプライベート メソッドを含む静的ユーティリティ クラスがあります。このようなメソッドをモックすると、次のことがわかります。

PowerMockito.spy(StaticUtil.class);
PowerMockito.when(StaticUtil.class, "getSomethingMethod", someObjectArray, someStringArray, aBoolean, someList).thenReturn(anotherList);

getSomethingMethod()が実際に呼び出されているため、null ポインター例外が発生しています。デバッグすると、テストしようとしているメソッドを実行したときに呼び出されていないことがわかりますが、モックをセットアップしているときに実行されています。 このサイトに基づいて、この形式でモックを作成すると、それが起こるはずです。

それで、私はこのようにモックを設定しようとします:

PowerMockito.spy(StaticUtil.class);        
PowerMockito.doReturn(anotherList).when(StaticUtil.getSomethingMethod( someObjectArray, someStringArray, aBoolean, someList);

getSomethingMethod()ただし、可視性をパブリックに変更する必要があるという Eclipse からのエラーが表示されます。PowerMockito を使用する大きな利点の 1 つは、プライベート メソッドをモックできることではないでしょうか。このメソッドをモックする必要がありprivate staticます (セットアップ中に実際にメソッドを呼び出す必要はありません)。

4

2 に答える 2

8

リンクした回答で指定されている正確な構文を使用する必要があります。その構文は. ここで提供した例はどちらもその例を使用していません。doReturn(returnValue).when(Class, String, arguments);


ここにいくつかの拡張された説明があります。これを実証するために、サンプル テスト フレームワークをまとめました。

このクラスでテストを実行しようとしています:

package org.test.stackoverflow;

import java.util.Collections;
import java.util.List;

public class StaticUtil {
  public static void Wrapper() {
    getSomethingMethod(null, null, false, Collections.<String>emptyList());
  }

  private static List<String> getSomethingMethod(Object[] obj,
      String[] str, boolean flag, List<String> aList){ 
    System.out.println("I happen!");
    return aList;
  }
}

メソッド自体が呼び出されると、 が表示されますI happen!。そうでない場合は、しません。

次に、このテスト クラスを使用します。

package org.test.stackoverflow;

import java.util.List;

import org.junit.runner.RunWith;
import org.junit.*;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;

@RunWith(PowerMockRunner.class)
@PrepareForTest(org.test.stackoverflow.StaticUtil.class)
public class StaticUtilTest {
  Object[] someObjectArray;
  String[] someStringArray;
  boolean aBoolean;
  List<String> someList;
  List<String> anotherList;

  @Test
  public void testWhenClassStringMethod() throws Exception {
    System.out.println("Beginning Test when(Class klass, String method name).doReturn(result)");
    PowerMockito.spy(StaticUtil.class);
    PowerMockito.when(StaticUtil.class, "getSomethingMethod", someObjectArray, someStringArray, aBoolean, someList).thenReturn(anotherList);
    System.out.println("End Test when");
  }

  @Test
  public void testDoReturnActualMethod() throws Exception {
    PowerMockito.spy(StaticUtil.class);
    // This doesn't compile as you've correctly stated
//    PowerMockito.doReturn(anotherList).when(StaticUtil.getSomethingMethod(someObjectArray, someStringArray, aBoolean, someList);
  }

  @Test
  public void testDoReturnClassStringMethod() throws Exception {
    System.out.println("Beginning Test doReturn().when(Class klass, String method name");
    PowerMockito.spy(StaticUtil.class);
    PowerMockito.doReturn(anotherList).when(StaticUtil.class, "getSomethingMethod", someObjectArray, someStringArray, aBoolean, someList);
    System.out.println("End Test doReturn");
  }
}

したがって、出力される場合I happenは、間違った構文を使用しています。このプログラムを実行すると、次のようになります。

Beginning Test when(Class klass, String method name).doReturn(result)
I happen!
End Test when
Beginning Test doReturn().when(Class klass, String method name)
End Test doReturn

したがって、3 番目の test の構文を使用する必要があります

注: この例では静的な空の引数を使用しています。明らかに、アプリケーションに応じて通常どおりArgument Matchersを使用するように例を構成する必要があります。

于 2015-08-03T21:31:34.703 に答える
-3

モック オブジェクトに期待値を設定するときは、Matchers.any() や Matchers.anyString() などの引数マッチャーを使用する必要がありますが、実際の引数は使用しないでください。

詳細については、J-Unit Test: Make static void method in final class throw exceptionに対する私の回答を参照してください。

durron597 の回答には潜在的な問題があります。「testDoReturnClassStringMethod」の構文が適切にモックされていません。そのメソッドで、彼は StaticUtil クラスをモックしようとしましたが、テスト メソッド ラッパーを呼び出しませんでした。例を見る

@Test
public void testDoReturnClassStringMethod() throws Exception {
    System.out.println("Beginning Test doReturn().when(Class klass, String method name");
    PowerMockito.spy(StaticUtil.class);
    PowerMockito.doReturn(anotherList).when(StaticUtil.class, "getSomethingMethod", someObjectArray, someStringArray, aBoolean, someList);
    StaticUtil.Wrapper();
    System.out.println("End Test doReturn");
}

この結果は

Beginning Test doReturn().when(Class klass, String method name
I happen!
End Test doReturn

「たまたま!」印刷されます。モックが正しく構成されていません。

モックの正しい方法は次のとおりです。

@Test
public void testDoReturnWithProperMock() throws Exception {
    System.out.println("Beginning Test doReturn().when(Class klass, String method name");
    PowerMockito.spy(StaticUtil.class);
    PowerMockito.doReturn(anotherList).when(StaticUtil.class, "getSomethingMethod", Matchers.anyObject(), Matchers.anyObject(), Matchers.anyBoolean(), Matchers.anyList());
    StaticUtil.Wrapper();
    System.out.println("End Test doReturn");

}

結果は次のとおりです。

Beginning Test doReturn().when(Class klass, String method name
End Test doReturn
于 2015-08-04T05:56:50.083 に答える