PowerMock/Mockito を使用してプライベート メソッドをモックしましたが、ここでの質問は、このメソッド内で宣言されたオブジェクトにアクセスするにはどうすればよいですか?
例えば 。
private void method1()
{
MyObject ob = new MyObject();
}
今、私のテスト コードでは、値を確認するために ob オブジェクトにアクセスしたいと考えています。
PowerMock/Mockito を使用してプライベート メソッドをモックしましたが、ここでの質問は、このメソッド内で宣言されたオブジェクトにアクセスするにはどうすればよいですか?
例えば 。
private void method1()
{
MyObject ob = new MyObject();
}
今、私のテスト コードでは、値を確認するために ob オブジェクトにアクセスしたいと考えています。
このガイドでは、PowerMockを使用したコンストラクター呼び出しのモックについて詳しく説明します。
...しかし、PowerMockを使用すると、コードを変更する必要はありません。代わりに、新しいFile(..)の呼び出しをインターセプトして、代わりにモックオブジェクトを返すようにPowerMockに指示できます。これを行うには、通常どおりFile.classタイプのモックを作成することから始めます。
File fileMock = createMock(File.class);新しいファイルへの呼び出しを期待するには、次のようにします。
expectNew(File.class, "directoryPath").andReturn(fileMock);
したがって、あなたの場合、テストケースまたはセットアップ方法にこれらを含める必要があります。
MyObject mockOb = createMock(MyObject.class);
expectNew(MyObject.class).andReturn(mockOb);
これらを追加すると、次のように動作します。
テストケースによって実行されるコードnew MyObject()にが含まれている場合は常に、PowerMockによってモックされたオブジェクトインスタンスが返されます。したがって、コード内のどこに新しいインスタンスを作成するかは問題ではなく、関数によって作成されたものとまったく同じになります。MyObjectcreateMock()
編集
例を見てみましょう
Class A { private void method1() { Obj obj = new Obj(); obj.setX(10); } //Here I want to access the obj object to verify the values }
これを達成するには、少し違った考え方をする必要があります。
pruivate method1()これらの線に沿った何か:
@Test
public void testMyPrivateMethod() {
    //1. object with the logic to test
    A a = new A();
    //2. set up mocking
    Obj mockObj = createMock(Obj.class);
    expectNew(Obj.class).andReturn(mockObj);
    //3. trigger logic to test
    a.someOtherMethodThatCallsMethod1();
    //4. test Obj (find out if setX() has been called or not)
    verify(mockObj).setX(any(Integer.class));
}