5

Spring 3 で作成された大規模なアプリケーションがあります。一部のサービスの動作をチェックする JUnit テストを作成する必要があります。ユニットではなく、システムの一部です。内部で連携するいくつかのサービスとリポジトリがあります->内部で注入された多くのBean。アプリはアスペクトも使用します。

私の質問はです。このテストの場合、構成と Bean を管理する方法は? アプリ構成で定義された Bean を使用する必要があり、テストでは永続性を使用して Bean のみを再定義し、組み込みデータベースを操作する必要があります。そのため、定義されている src の Bean を使用し、いくつかの原因となる問題 (永続性 Bean、Web サービスを使用する Bean など) のみをオーバーライドする必要があります。でも次はわからない。テスト構成クラスに次のように注釈を付けようとしました:

@Configuration
@EnableAspectJAutoProxy
@EnableTransactionManagement(mode = AdviceMode.ASPECTJ, proxyTargetClass = true)
@ComponentScan(basePackages = "com.example.our.app")
public class MyTestConfig implements TransactionManagementConfigurer {

アプリケーション全体をスキャンし、src フォルダーから Bean の構成を使用します。ただし、これは問題を引き起こす他のテストからの構成も取得します。これは全体的に良い戦略ですか?今何 - excludeFilters を使用して他のテスト構成を削除しますか? それとも、この戦略は全体的に悪いのでしょうか?

ありがとう

4

3 に答える 3

2

@ContextHierarchyアノテーションによって提供されるコンテキストマージ機能を使用して、Bean を選択的に上書きできます。

ユースケースでこれを機能させるには、アプリケーションで Spring Bean をスキャンする基本コンテキストを作成する必要があります。

@Configuration
@ComponentScan({"com.example.our.app"})
public class MyTestConfig implements TransactionManagementConfigurer {

次に、このコンテキストを利用して名前を付ける基本クラスを作成します。これは、名前付きコンテキストでは機能しません! :

@RunWith(SpringJUnit4ClassRunner.class)
@ContextHierarchy( {
    @ContextConfiguration(name="testContext", classes = MyTestConfig.class),
})
public class BaseTest {

そして最後に、基本クラスを拡張し、同じ名前で新しいコンテキストを定義して、テスト固有の構成で個々の Bean を上書きする単体テストを作成します。

    @ContextHierarchy(@ContextConfiguration(name="testContext", classes = OneUnitTest.Config.class))
    public class OneUnitTest extends AggroBaseTest {
      @Configuration
      static class Config {      
            ..
      }
于 2015-02-03T11:58:17.767 に答える
2

ここで使用する最善の方法はSpring プロファイルだと思います。プロファイルを使用したテストに H2 を使用するには、ここをクリックしてください。

于 2013-03-22T15:22:52.703 に答える
0

別のインポートで上書きすることもできます

<beans>
    <import resource="classpath*:applocationContext.xml" />
    <bean id="dataSourceFactory" class=com.demo.MyNewClass/>
</beans>

そして、もしあなたがクラスで

this.applicationContext.getBean("dataSourceFactory");

クラスを取得すると、新しいクラスのインスタンスが表示されます

さらに遠く

<bean id="dataSourceFactory" class="org.springframework.jdbc.datasource.DriverManagerDataSource" >
    <property name="driverClassName" value="${jdbc.driverClassName}"/>
    <property name="url" value="${jdbc.url}"/>
    <property name="username" value="${jdbc.username}"/>
    <property name="password" value="${jdbc.password}"/>
</bean>

したがって、デフォルトの動作をオーバーライドするにはさまざまな方法があります

于 2015-06-30T14:23:21.793 に答える