3

Mockito を使用してクラスをテストしています。Mockito の別のモック オブジェクト内にモックを挿入する方法がなかったため、ディープ スタブを使用しようとしています。

class MyService{

    @Resource
    SomeHelper somehelper;

    public void create()
    {
        //....
        somehelper.invokeMeth(t);
    }
}

class SomeHelper{
    @Resource
    private WebServiceTemplate webServiceTemplate;

    public void invokeMeth(T t)
    {
        try{
            //...
            webServiceTemplate.marshalSendAndReceive(t);
        }catch (final WebServiceIOException e) {
            throw new MyAppException("Service not running");
        }
    }
}

今、私は MyService クラスの create() メソッドを単体テストしようとしています。次のように SomeHelper のモックを注入しました

@Mock(answer = Answers.RETURNS_DEEP_STUBS)
SomeHelper somehelper;

私が今欲しいのは、モックされた somehelper オブジェクトで invokeMeth() メソッドが呼び出されたときに、この場合は実際のメソッドを呼び出すことです。

when(somehelper.invokeMeth(isA(RequestObject.class)))
    .thenCallRealMethod();

この場合、webServiceTemplate が null ではないことを期待していました。

ただし、コードが行を実行しようとすると、Nullpointer 例外が発生します

webServiceTemplate.marshalSendAndReceive(t);

ディープ モック オブジェクト (つまり、モック内のモック - この場合は somehelper モック内の webserviceTemplete モック) にアクセスし、 when 条件を適用して WebserviceIOException をスローする方法の手がかりはありますか? MyService.create() をテストして、WebServiceIOException がコードにスローされたときに適切に動作することを確認できるように、これが必要です。

4

1 に答える 1

4

はい、もちろん、実際のオブジェクトとモックを混合しています。thenCallRealMethodさらに、部分的なモックのようにllokを使用すると、ここでは間違っているように感じます。このメソッドのjavadocがそれについても説明しているのも不思議ではありません。

私は間違いなくあなたにストレスを与えるべきです、デザイン的には、モックを返すモックを持っていることはしばしば匂いです。より正確には、あなたはデメテルの法則に違反している、または「教えてはいけない」の原則に従わない。

あなたのコードを見ていると、なぜコードをモックする必要があるのか​​わかりませんWebServiceTemplate。ユニットテストをしたいのですがMyService、との関係がわかりませんWebServiceTemplate。代わりに、ヘルパーとのやり取りのみに焦点を当てる必要があります。また、との間の相互作用を確認できる単体テストをSomeHelper 個別SomeHelperに行いますWebServiceTemplate

これが私が物事をどのように見るかの小さな例です:

public void ensure_helper_is_used_to_invoke_a_RequestObject() {
  // given a service that has an helper collaborator
  ... other fixture if necessary

  // when
  myService.behaviorToTest();

  // then
  verify(someHelperMock).invokeMeth(isA(RequestObject.class));
}

実際のユースケースを探す人はどうですか?

お役に立てば幸い

于 2012-11-21T19:07:41.147 に答える