私には本当に奇妙に思える問題があります。私は次の設定をしています:
インターフェース:
package com.example;
public interface SomeDependency {
}
スプリングコンポーネント:
package com.example;
@Component
public class SomeClass {
}
EasyMockによって生成されたモックビーンを使用したスプリングテスト構成:
<beans ....>
<context:component-scan base-package="com.example"/>
<bean id="someInterfaceMock" class="org.easymock.EasyMock" factory-method="createMock">
<constructor-arg value="com.example.SomeDependency" />
</bean>
</beans>
そしてユニットテスト:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("/testconfig.xml")
public class SomeClassTest {
@Autowired
SomeClass someClass;
@Autowired
SomeDependency someDependency;
@Test
public void testSomeClass() throws Exception {
assertNotNull(someClass);
}
@Test
public void testSomeDependency() throws Exception {
assertNotNull(someDependency);
}
}
プロジェクトはコンパイルされ、テストは問題なく合格します。つまり、SomeClass(「実際の」オブジェクト)とSomeDependency(EasyMockによって生成されたモックオブジェクト)の両方の自動配線が成功します。
ただし、SomeClassの実装を次のように変更した場合:
@Component
public class SomeClass {
@Autowired
SomeDependency someDependency;
}
両方のテストが失敗するのは
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [com.example.SomeDependency] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
だから私の質問は:
- SpringがSomeClassへの依存関係の自動配線に失敗するのはなぜですか( SomeClassTestへの同じ依存関係の自動配線に成功した場合)?
- SomeClassTestまたはtestconfig.xmlを変更して、テストに合格させるにはどうすればよいですか?
コメント:実際には、 SomeClassで表されるクラスはフレームワークの一部です。その結果、少なくとも妥当な時間内に、簡単に更新することはできません。
依存関係:
- 春:3.0.5.RELEASE
- EasyMock:3.0
編集:
Spring 3.2 RC1の時点で、ジェネリックファクトリメソッドとモックオブジェクトの問題が解決されました。
/マティアス