0

SpringのコントローラーテストをJmockで作成します。コントローラは、データベース操作にインターフェイスを使用します。これらはサービスクラスです。それらをjmockして、setterを介してテストでコントローラーに渡すことができます。

実際のコントローラーには、@Reource-anotationでマークされたサービスがあります

@Resourceプライベートサービスサービス;

最終的なサービスサービスをテストする=context.mock(Service.class); controller.setService(service); controller.CallMethodToTest();

コントローラコードでは、サービスオブジェクトは通常、Springの@Resourceアノテーションで初期化されます。問題は、コントローラがバリデーターや内部クラスなどの内部呼び出しで同じサービスを使用する場合です。

実際のバリデーターには、@Reource-anotationでマークされたサービスもあります

@Resourceプライベートサービスサービス;

テストでは、たとえばバリデーターオブジェクトを導入し、それにサービスを設定してコントローラーに渡すことができます。

 MyValidator validator = new MyValidator();
 validator.setService(service);
 controller.setValidator(validator);

バリデーターとしましょう。検証はservice.getSomethingを呼び出します。getSomething();のExpectationsを作成する必要がありました。コントローラでは、同じメソッドを呼び出すこともできます。

        context.checking(new Expectations() {
        {
            allowing(service).getSomething();
            will(returnValue(mockData));

        }
    });

カーディナリティを許可しているにもかかわらず、このような状況は

 allowed, already invoked 1 time

これは一般的なシナリオであり、これ以上具体的なコードを提供することはできません。これは、コントローラーとバリデーターの両方のサービスメソッド呼び出しと関係があると思います。誰かがこれを修正するためのヒントを教えてもらえますか?

4

1 に答える 1

0

JMockを使用する場合、すべてのモックオブジェクトには名前があります。この名前は一意である必要があります。

このメソッドを使用する場合Mockery.mock(Class<T> typeToMock)、名前はクラス名から派生します。したがって、このメソッドを使用して作成できる各クラスのモックは1つだけです。

同じクラスの異なるモックが複数必要な場合は、Mockery.mock(Class<T> typeToMock, String name)代わりに使用し、各モックに異なる名前を付けます。

于 2013-01-04T11:14:50.570 に答える