1

次のリンクで提案されているパターン 1 を使用したい: https://code.google.com/p/mockito/wiki/MockingObjectCreation と次のクラスがあります。

public class MyClass {
  private AnyType anyObject;
  private Foo foo; // Foo is a thirdparty class

  public MyClass(AnyType anyObject) {
    //...
    foo = makeFoo();
  }

  private Foo makeFoo() {
    return new Foo();
  }
}

私は次のようにテストをしようとしています:

@Test
public void myTestMethod() {
  MyClass myClass = Mockito.spy(new MyClass());

  // now i want to do something like this:
  Foo mockFoo= Mockito.mock(Foo.class);
  // Mockito.doReturn(mockFoo).when(myClass).makeFoo());
}

問題は、ファクトリ メソッドの makeFoo がプライベート メソッドであるため、アクセスできないことです。テストのためだけに公開したくありません。私のテスト クラスも私の生産的なコードと同じパッケージに含まれていないため、パッケージに対してのみ表示することはできません。

更新: 別の問題が見つかりました。makeFoo() がパブリックであると仮定すると、「mockFoo」も返されませんが、実際の makeFoo() メソッドが呼び出されます。これは、makeFoo() (MyClass のコンストラクター内) の呼び出しが mockFoo の作成前に行われるために発生します。

誰かがこの問題を解決する方法を知っていますか、それとも私は何か完全に間違っていますか?

助けてくれてありがとう!

4

2 に答える 2

0

PowerMockitowhenNewをご覧ください。これにより、オブジェクトのコンストラクター呼び出しを「上書き」し、代わりにそのモックを返すことができます。

http://powermock.googlecode.com/svn/docs/powermock-1.3.7/apidocs/org/powermock/api/mockito/PowerMockito.html#whenNew%28java.lang.Class%29

http://www.gitshah.com/2010/05/how-to-mock-constructors-using.html

于 2013-10-10T09:26:58.570 に答える
0

クラス内にフィールドを設定する必要があるだけの場合は、次の方法で実行できますMockitoAnnotations

必要なフィールドを作成し、それらに注釈を付け、セクション呼び出しの前に単体テストするだけですMockitoAnnotations.initMocks(this)

あなたの場合、次のようになります。

 @Spy
 @InjectMocks
 MyClass myClass;
 @Mock
 Foo foo;

 @Before
 public void initMocks() {
     MockitoAnnotations.initMocks(this);
 }

上記のドキュメントもお読みください。

于 2013-10-09T11:45:59.943 に答える