春テストフレームワークと注釈ベースの自動化問題
-
12-09-2020 - |
質問
SpringのTestFrameworkを使用してDAOに2つの異なる実装を使用します。
src.main.java
.businessobjects
\-User.java
.dao
\-IUserDAO.java
.daojpa
\-UserDAO.java
.daohibernate
\-UserDAO.java
.
春テストケースIN:
src.test.java.base:
package base;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.transaction.annotation.Transactional;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("/hibernate-beans.xml")
@Transactional
public abstract class SpringTestCase {}
.
とここにエラーがあります:
java.lang.IllegalStateException: 注釈指定Bean名 Bean Classのための 'userdao' [JPADAO.USERDAO] 既存の競合、 同じの非互換性のあるBean定義 名前とクラス [Jpaadao.Userdao]
私はすでに修飾子を使用して自動化を上書きしようとしました。:
<bean class="jpaadao.UserDAO">
<qualifier value="jpaa"/>
</bean>
<bean class="jpadao.UserDAO">
<qualifier value="jpa"/>
</bean>
.
、その後
のテストケース配線で@Autowired
@Qualifier("jpa")
private IUserDAO userDAO;
.
しかしエラーは持続します。
2つの質問:
- この問題は、注釈ベースの設定で解決できますか?
- autowiringと注釈なしでテストを実行する方法
解決
あなたは名前なしでBeanを使用しているので、Springが名前を思いつくようにしてください、この名前はあなたがおそらくあなたのクラスに持っている@componentの注釈に基づいていますが、それはあなたのCamelcasedバージョンでもあります。あなたのBeanの非修飾クラス名(どちらの場合も、それらが等しいということで、それがオブジェクトに春を引き起こします)。
また、私に少し奇妙に見えるような方法でコンポーネントスキャンとXML構成をミキシングしているようです。
これから多くの方法がありますが、最もきれいにあなたはあなたが完全にしようとしている契約を実装する単一のBeanだけを使うでしょう。あなたが異なる実装を必要とするならば、あなたは彼らに異なるより分散的な名前を与えるべきです:
<bean id="jpaUserRepository" class="..JpaUserRepository"/>
.
これは、自動配線に頼るためBean名が使用されない場合でも、より便利なログ記録を与えます。
他のヒント
- IWEINが提案したことを行います。実装クラスをより良く(例えば、HibernateUserdaoとJpauserdao)。または、userdao実装クラスの@componentまたは@repositoryの注釈を介して一意のBean名を指定してください。
- 現在自動化なしでテストを実行することはできません。詳細はこのJIRAの問題を参照してください。 https://jira.springsource.org/browse/spr-6050
wantes、
SAM(Spring TestContextフレームワークの作成)
p.S。いいえ、あなたが直面している問題はSPR-4524とは関係ありません。
@Resource
アノテーションを使用して、名前ごとに依存関係を求めることができます。あなたはBeanに名前(IDS)を与えるか、デフォルトを使用する必要があります。これは、不適切な非修飾クラス名です。
今すぐ走りなさい!しかし、私はこれがベストプラクティスであるとは思わない。appcontext.xmlに書き込んで不要なDAOのパスを除外しました。
<context:component-scan base-package="test">
<context:exclude-filter type="regex" expression="test\.daohibernate.*"></context:exclude-filter>
</context:component-scan>
.
提案?この問題は、 http://jira.springframework.org/browse/spr-4524と関連していますか。/ a>?