6

Spring Junit Supportで実行されるテストケースが多数あり、各テストに次のアノテーションが付いています。

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations="classpath:spring/applicationContext.xml")
@TransactionConfiguration(transactionManager="transactionManager")
@Transactional
@ActiveProfiles("test")

これらすべてのアノテーションを各テストクラスに配置する代わりに、カスタムアノテーションを作成して使用したいと思います。

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations="classpath:spring/applicationContext.xml")
@TransactionConfiguration(transactionManager="transactionManager")
@Transactional
@ActiveProfiles("test")

@Target({ ElementType.FIELD, ElementType.PARAMETER, ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface SpringJUnit4TestConfig {

}

しかし、このカスタムアノテーションを使用すると、SpringInjectionはまったく発生しません。

@SpringJUnit4TestConfig
public class UserServiceTest
{
}

私がここで欠けているものは何ですか?

PS:しかし、JUnitの@RunWithとSpringの@Transactional、@ContextConfigurationはすべて@Explicit..なので、動作するはずだと思いました。しかし今のところ、私は回避策を通してそれを乗り越えます。Based Abstractクラスを作成し、それらすべてのアノテーションとそのBaseクラスを拡張するテストケースを配置しました。

4

1 に答える 1

3

JUnitアノテーションのように、このアプローチが機能するとは思わない@RunWithので、これが機能するには、JUnitアノテーションが推移的である必要があります。

クラスに@RunWithの注釈が付けられているか、@ RunWithの注釈が付けられているクラスを拡張すると、JUnitは、JUnitに組み込まれているランナーではなく、参照するクラスを呼び出して、そのクラスでテストを実行します。この機能は開発の後半に追加されました。強力なように見えますが、人々が実際にどのように使用するかを学ぶにつれて、ランナーAPIが変化することを期待しています。現在内部にあるクラスのいくつかは、おそらく洗練されて公開されるでしょう。

したがって、テストJUnitテストの呼び出しは、継承されたクラスに対してのみ機能するようです。

Springに関しては、構成場所のコンテキスト構成継承と呼ばれるものをサポートしています。これが他のアノテーションタイプで機能するかどうかはよくわかりません(そうでない場合は、ドキュメントを参照してください)。テスト構成クラスの継承の場合は、@Transactionalアノテーション自体がで宣言されているため、他のアノテーション@Inherited

したがって、この場合、JUnitアノテーションが欠落しているため、実行されません。

于 2012-09-23T13:58:52.097 に答える