0

Spring 3.1/Java/Tomcat アプリケーションがあります。次のようなサービスクラスがあります。

public class SomeServiceImpl implements SomeService {

  @Autowired
  public AnotherService anotherService;

  //  other code...

これは、自動配線された別のサービス クラス AnotherService を使用します。これらのサービス クラスは両方とも、serviceContext.xml ファイルで宣言されています。

私は、SomeServiceImpl をテストする junit を作成し、autowired を使用して、テスト対象のクラス (SomeService) と、テスト対象のクラス (AnotherService) に必要なモック (EasyMock) の依存関係を注入しています。AnotherService の easymock 依存関係は、次のように testContext.xml で定義されます。

    <bean id="mockAnotherService" class="org.easymock.EasyMock" factory-method="createMock" primary="true">
        <constructor-arg value="com.xyz.AnotherService" />
    </bean>

テスト クラスでは、両方のコンテキスト ファイルを使用するように構成します。ただし、ServiceImpl が実際の実装に正しく配線されていることがわかります (これは望ましいことです) が、AnotherService のモック バージョンではなく、concreate バージョン (AnotherServiceImpl) が配線されています。

代わりに、依存関係の模擬バージョンを有線で取得するにはどうすればよいですか? @Resource または @Qualifier を実際の実装で使用することはできません。目的に反するからです。テストクラスでこれらを使用しても問題ありません。

4

2 に答える 2

2

両方とも で宣言されていてserviceContext.xml、そのうちの 1 つをモックしたい場合、そのファイルはテストには使用できません。モックを含むテスト コンテキストと組み合わせて「実際の」Spring コンテキスト ファイルの 1 つを使用できるように分割するか、単に Bean を手動で作成AnotherServiceし、setter メソッドを使用して設定します。制御の反転の利点の 1 つは、手動で Bean を作成し、その方法で依存関係を注入できることです。

于 2012-05-11T15:10:09.387 に答える
1

両方のコンテキスト ファイルを使用するように構成する代わりに、serviceContext.xml を testContext.xml にインポートして、テスト ケースで textContext.xml のみを参照できます。

構成ファイルを別のファイルにインポートすると、そのファイルは、インポートされたファイルの Bean 定義をオーバーライドする機会を得ます。

モックの ID がクラスと同じであることを確認してください。そうしないと、2 つの異なる Bean が作成されます。もう 1 つの問題は、モック オブジェクトが正しいインターフェイス タイプをアドバタイズしないことです。そのため、タイプによる自動配線が失敗する可能性があります。この問題を回避するには、次のようなことを行う必要があります。私はこのアプローチをmockitoで使用しています-簡単なモックでも機能するはずです。

<bean id="anotherService" class="org.springframework.aop.framework.ProxyFactoryBean">
    <property name="target">
     <bean class="org.easymock.EasyMock" factory-method="createMock" primary="true">
        <constructor-arg value="com.xyz.AnotherService" />
    </bean>
    </property>
    <property name="proxyInterfaces">
      <value>com.xyz.AnotherService</value>
    </property>
  </bean>

もう 1 つ試すことは、モック オブジェクトを作成するクラスで Java Config スタイルのメソッドを作成することです。これをテストクラスで直接作成してもうまくいかない場合は、モックを作成するメソッドを使用して @Configuration を持つ別のクラスを作成し、それを testContext.xml で Bean として定義できます。

  @Bean
  AnotherService anotherService() {
      return EasyMock.createMock(AnotherService.class);
  }
于 2012-05-11T15:16:49.937 に答える