一連の統合テストを行うプロジェクトに取り組んでいます。これらのテストの 1 つは、サード パーティ ベンダーに対して多くのネットワーク呼び出しを行ったクラスを自動配線しました。テストでこれらの呼び出しを行いたくなかったため、チームは testApplicationContext.xml Spring 構成ファイルを介してこのクライアントをモックアウトしました。
統合テスト クラス:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("/testApplicationContext.xml")
@TransactionConfiguration(transactionManager="transactionManager", defaultRollback=true)
@Transactional
public class IntegrationTest {
testApplication.xml の定義:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:aop="http://www.springframework.org/schema/aop"
http://www.springframework.org/schema/cache/spring-cache.xsd
http://www.springframework.org/schema/jee
http://www.springframework.org/schema/jee/spring-jee-3.1.xsd">
<aop:aspectj-autoproxy />
<context:component-scan base-package="com.mycompany" />
<context:component-scan base-package="tst.mycompany.mocks"/>
<import resource="mock-beans.xml"/>
mock-beans.xml の定義:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"...>
<!-- Override bean definitions with mocks -->
<bean id="thirdPartyClientService" class="tst.mycompany.mocks.MockThirdPartyClient" />
</beans>
これはセットアップで正常に機能し、テストとして実行すると、MockThirdPartyClient のインスタンスが Spring Bean に自動配線されます。
ただし、最近、同じパッケージに別のサービスの新しいモックを追加しましたが、ロードできません。エラーが発生します:
クラスパスリソース [mock-beans.xml] で定義された「addressService」という名前の Bean のクラス [tst.mycompany.mocks.MockAdressService] が見つかりません。ネストされた例外は java.lang.ClassNotFoundException: tst.mycompany.mocks.MockAdressService です
更新されたmock-beans.xmlは次のとおりです。
<beans xmlns="http://www.springframework.org/schema/beans">
<!-- Override bean definitions with mocks -->
<bean id="thirdPartyClientService" class="tst.mycompany.mocks.MockThirdPartyClient" />
<bean id="addressService" class="tst.mycompany.mocks.MockAdressService" />
</beans>
機能する最初の依存関係を自動配線する方法は次のとおりです。
@Autowired ThirdPartyClientServiceI client;
そうでないもの:
@Autowired AddressServiceI addressService;
すべてのスペルを再確認しましたが、すべて一致しているので、これが機能していないのはおかしいです。何かが正しくキャッシュされていない可能性があると思いました...しかし、すべてを更新してクリーンアップしましたが、サイコロはまだありません。
これらのモックのどちらにも注釈 FWIW はありません。モック アウトするように設計されたサービスのインターフェイスを実装するだけです。どちらもフォルダの下にありsrc/test/java
ます。
package tst.mycompany.mocks;
public class MockAddressService implements AddressServiceI {
問題のスタックトレース:
Caused by: java.lang.ClassNotFoundException: tst.mycompany.mocks.MockAdressService
at java.net.URLClassLoader.findClass(URLClassLoader.java:381) ~[?:1.8.0_71]
at java.lang.ClassLoader.loadClass(ClassLoader.java:424) ~[?:1.8.0_71]
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331) ~[?:1.8.0_71]
at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ~[?:1.8.0_71]
at org.springframework.util.ClassUtils.forName(ClassUtils.java:250) ~[spring-core-4.2.2.RELEASE.jar:4.2.2.RELEASE]
bin フォルダーを確認したところ、コンパイルされたクラスがそこにあります。