5

Springのテストフレームワークを使用したDAOには、2つの異なる実装を使用したいと思います。

src.main.java

.businessobjects
   \-User.java
.dao
   \-IUserDAO.java
.daojpa
   \-UserDAO.java
.daohibernate
   \-UserDAO.java

春のテストケース:

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クラス[jpadao.UserDAO]のアノテーション指定のBean名'userDAO'が、同じ名前およびクラス[jpaadao.UserDAO]の既存の互換性のないBean定義と競合しています。

修飾子を使用して自動配線をオーバーライドしようとしました。例:

<bean class="jpaadao.UserDAO">
    <qualifier value="jpaa"/>
</bean>
<bean class="jpadao.UserDAO">
    <qualifier value="jpa"/>
</bean>

そして、テストケースの配線で

@Autowired
@Qualifier("jpa")
private IUserDAO userDAO;

しかし、エラーは解決しません。

2つの質問:

  1. この問題は、アノテーションベースの構成でどのように解決できますか?
  2. 自動配線と注釈なしでテストを実行するにはどうすればよいですか?
4

4 に答える 4

2

Springが名前を思い付くように、名前のないBeanを使用しています。この名前は、おそらくクラスにある@Componentアノテーションに基づいている可能性がありますが、非修飾クラスのキャメルケースバージョンである可能性もあります。 Beanの名前(どちらの場合も同じになるため、Springは反対します)。

また、コンポーネントのスキャンとxml構成を、私には少し奇妙に見える方法で混合しているようです。

これには多くの方法がありますが、最もクリーンな方法は、実行しようとしているコントラクトを実装する単一のBeanのみを使用することです。異なる実装が必要な場合は、それらに異なる、よりわかりやすい名前を付ける必要があります。

<bean id="jpaUserRepository" class="..JpaUserRepository"/>

これにより、自動配線に依存しているためにBean名が使用されない場合でも、より便利なロギングが可能になります。

于 2010-07-08T20:06:26.947 に答える
1
  1. Iweinが提案したことを実行します。実装クラスに適切な名前を付けます(例:HibernateUserDaoおよびJpaUserDao)。または、UserDAO実装クラスの@Componentまたは@Repositoryアノテーションを介して一意のBean名を指定します。
  2. 現在、自動配線なしでテストを実行することはできません。詳細については、このJIRAの問題を参照してください:https ://jira.springsource.org/browse/SPR-6050

よろしく、

サム(Spring TestContext Frameworkの作成者)

psいいえ、あなたが直面している問題はSPR-4524とは関係ありません。

于 2010-07-11T18:03:23.017 に答える
0

@Resourceアノテーションを使用して、名前で依存関係を挿入してみることができます。Beanに名前(ID)を付けるか、デフォルトの大文字と小文字を区別しないクラス名を使用する必要があります。

于 2010-07-08T05:52:56.500 に答える
0

私は今それを稼働させています!ただし、これがベストプラクティスではないと思います。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に関連している可能性がありますか?

于 2010-07-08T14:53:40.210 に答える