1

ローカル オブジェクトを作成し、そのローカル オブジェクトのメソッドを呼び出す以下のようなクラス メソッドがあります。

public class MyClass {
    public someReturn myMethod(){
        MyOtherClass otherClassObject = new MyOtherClass();
        boolean retBool = otherClassObject.otherClassMethod();
        if(retBool){
            // do something
        }
    }
}

public class MyClassTest {
    @Test
    public testMyMethod(){
        MyClass myClassObj = new MyClass();
        myClassObj.myMethod();
        // please get me here.. 
    }
}

をテストしているときは、モックを作成して、選択したものを返しmyMethodたいと考えています。otherClassObject.otherClassMethodotherClassMethod はメッセージ キューに対していくつかのクラスを実行しますが、単体テストではそれを望んでいません。そのため、otherClassObj.otherClassMethod() を実行したときに true を返したいと考えています。この場合、インスタンス化にファクトリを使用したに違いないことはわかっていMyOtherClassますが、それはレガシー コードであり、今はコードを変更したくありません。この場合、Mockito はこのモック機能を提供していませんが、PowerMockito ではMyOtherClass可能です。ただし、上記のシナリオの例は見つかりませんでしたが、静的クラスのみが見つかりました。SUT のメソッド内でローカルオブジェクトをモックするにはどうすればよいですか?

また、Mockito を使用したローカル スコープ オブジェクトのメソッドのモッキングなど、他の OS に関する質問にも言及しましたが、役に立ちませんでした。

コード例は非常に役立ちます。

4

2 に答える 2

4

PowerMockito を使用している場合は、whenNewメソッドを使用できます

次のようになります。

@RunWith(PowerMockRunner.class)
@PrepareForTest(MyClass.class)  //tells powerMock we will modify MyClass to intercept calls to new somewhere inside it
public class MyClassTest{

    @Test
    public void test(){
          MyOtherClass myMock = createMock(MyOtherClass.class);
          //this will intercept calls to "new MyOtherClass()" in MyClass
          whenNew( MyOtherClass.class).withNoArguments().thenReturn( myMock) );
          ... rest of test goes here

   }

また、この他のSO投稿にもサンプルコードがありますPowerMockito Mocking whenNew 影響を受けない

于 2015-04-01T18:46:22.573 に答える