2016-09-09 4 views
0

私はテストのないレガシーアプリケーションを扱わなければなりません。したがって、リファクタリングを開始する前に、すべてがそのまま動作することを確認したいと思います。Mockitoは「欲しいですが呼び出されませんでした」と言っていますが、デバッグテストはそのメソッドにジャンプします

ここで、次のような状況を想像してみてください。

public SomeObject doSomething(final OtherObject x, final String something) { 
    if(x != null) { 
     final String = someOtherMethod(x, something); 
    } 
} 

protected String someOtherMethod(final OtherObject x, final String something) { 
    .... 
} 

は今、私は保護されたメソッドが

としても呼ばれていることを確認するだから私はこの

@InjectMocks // Yes there is more going on here 
private MyTestObject myTestObject; 

private MyTestObject spy; 

private static final OtherObject VALID_OTHER_OBJECT = new OtherObject(); 

@Before 
public void setup() { 
    this.spy = Mockito.spy(myTestObject); 
} 

@Test 
public void ifOtherObjectIsNotNullExpectSubMethodToBeCalled() { 
    myTestObject.doSomething(VALID_OTHER_OBJECT, null); 
    verify(spy).someOtherMethod(VALID_OTHER_OBJECT, null); 
} 

をした私は失敗のテストを取得します「呼び出されましたが呼び出されません...」とsomeOtherMethod()。 私はすぐにデバッグモードに入り、チェックしました。そのメソッドは呼び出されます!

この原因は何ですか?私はここでスパイを悪用していますか?

編集:私はこれがあなたが典型的にテストするものではないことを知っていることを知っています。特にsomeOtherMethod(...)には戻り値がありません。しかし、戻り値がvoidだったと想像してください。

基本的に私はここでスパイが失敗する理由を理解したいと思います。

答えて

1

に従って、Mockito.spy(object)は、渡されたオブジェクトのコピーを作成します。オブジェクトで渡された元のメソッドを呼び出すと、スパイインスタンスが同じオブジェクトではないため、スパイに登録されません。

myTestObject.doSomething(...)からspy.doSomething(...)に変更する必要があります。

別の方法(同じことを達成する別の方法): myTestObjectで@Spyアノテーションを使用することを検討してください。 (あなたのjunitテストの)初期化メソッドに必ずMockitoAnnotations.initMocks(this);を追加してください。 @Before@Mockアノテーションも便利です。

+0

ディープコピーですか? – Sorona

+0

@Soronaドキュメントでは指定されていませんが、ソースのクイックチェックではnoと表示されます。浅いコピーのみ。 – Douglas

0

1つのオブジェクトが別のオブジェクトを作成していて、他のオブジェクトが呼び出しを行っていました。だから私はその内部オブジェクトがスパイ参照を代わりに使用する必要がありました。リフレクションを使用し、ホワイトボックスを使用して参照を更新しました。

TestAddressFragment fragment = spy(new TestAddressFragment()); 
AddressPresenter presenter = fragment.getPresenter(); 
Whitebox.setInternalState(presenter, "view", fragment); 

私のフラグメントは、そのメソッドが呼び出されたかどうかをチェックできます。

verify(fragment).showAddress(any(), anyBoolean()); 
関連する問題