2

以下のように、Spring コンテキスト ファイル 'applicationContext.xml' で Bean を定義しました。

<bean id="daoBean" class="org.mockito.Mockito" factory-method="mock">
        <constructor-arg value="com.xxx.DAOImpl" />
</bean> 

私のサービス クラス (ServiceImpl) では、以下のようにこの Bean を使用しています。

 @Component("serviceImpl")
 public class ServiceImpl{
        // other code here

        @Autowired
        private transient DAOImpl daoBean;

        // other code here
    }

JUnit テスト クラスからサービス クラスにアクセスしています。

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "/applicationContext.xml" }) 
public class JUnitTest{
    // other code here

    @Autowired
    private transient ServiceImpl serviceImpl;

    // test cases are here
}

テスト ケースを実行すると、次のようなエラーが表示されます。

「ServiceImpl」という名前の Bean の作成中にエラーが発生しました: 自動配線された依存関係の注入に失敗しました。ネストされた例外は org.springframework.beans.factory.BeanCreationException: Could not autowire field: private transient com.xxx.DAOImpl です

サービス クラスから @Autowired を削除して @Resource(name = "daoBean") を使用すると、テスト ケースは正常に動作します。

public class ServiceImpl{
            // other code here

            @Resource(name = "daoBean")
            private transient DAOImpl daoBean;

            // other code here
        }

私の質問は、この場合 @Autowired が機能しないのはなぜですか? 適切に機能するように、@Autowired を使用して他に何かを構成する必要がありますか。@Autowired を @Resource に置き換えるためにサービス層クラスを変更したくありません。

4

1 に答える 1

3

Mockito.mock()実行時に消去される一般的な戻り値の型Tがあるため、Spring は作成されたモックの型を推測できずObject、Spring コンテキストとして単純に登録されます。@Autowiredそれが機能しない理由です (依存関係をそのタイプで検索しようとするため)。

問題の解決策については、この回答を確認してください。

于 2013-05-15T11:45:16.163 に答える