Spring がテストに適していると言われる理由の 1 つは、単体テストで新しいものやモックを作成するのが簡単だからです。
別の方法として、次のセットアップを使用して大成功を収めました。これはあなたが望むものに非常に近いと思います。強くお勧めします。
異なるコンテキストで異なる実装を必要とするすべての Bean について、アノテーション ベースの配線に切り替えます。他はそのままで構いません。
次の一連の注釈を実装します
<context:component-scan base-package="com.foobar">
<context:include-filter type="annotation" expression="com.foobar.annotations.StubRepository"/>
<context:include-filter type="annotation" expression="com.foobar.annotations.TestScopedComponent"/>
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Repository"/>
</context:component-scan>
次に、ライブ実装に @Repository でアノテーションを付け、スタブ実装に @StubRepository でアノテーションを付けます。さらにいくつかの注釈が必要になるかもしれませんが、これらは素晴らしい出発点です。
spring.xml が多数ある場合は、基本的にコンポーネント スキャン定義のみを含むいくつかの新しい spring xml ファイルを作成する必要があります。通常は、これらのファイルを通常の @ContextConfiguration リストに追加するだけです。この理由は、コンテキスト スキャンの構成が異なることが多いためです (信頼してください。Web テストを行っている場合は、少なくとも 1 つの注釈を追加することになります。これにより、4 つの関連する組み合わせが作成されます)。
次に、基本的に使用します
@ContextConfiguration(locations = { "classpath:/path/to/root-config.xml" })
@RunWith(SpringJUnit4ClassRunner.class)
この設定では、スタブ データとライブ データを交互に組み合わせることはできないことに注意してください。私たちはこれを試しましたが、結果として混乱が生じたと思います。誰にもお勧めしません ;) スタブの完全なセットまたはライブ サービスの完全なセットのいずれかを配線します。
依存関係が通常非常に大きいものの近くで gui をテストするときは、主に自動配線されたスタブの依存関係を使用します。コードのよりクリーンな領域では、より定期的な単体テストを使用します。
私たちのシステムには、コンポーネント スキャン用の次の xml ファイルがあります。
- 通常のWeb制作に
- スタブのみで Web を開始する場合
- 統合テスト用 (junit)
- 単体テスト用 (junit)
- Selenium Web テスト用 (junit)
これは、アプリケーションを開始できるシステム全体の構成が全部で 5 つあることを意味します。アノテーションのみを使用するため、Spring は、配線したい単体テストでさえ自動配線するのに十分高速です。私はこれが非伝統的であることを知っていますが、それは本当に素晴らしいです.
統合テストは完全なライブ セットアップで実行されますが、1 回か 2 回は本当に実用的になることに決め、5 つのライブ配線と 1 つのモックを作成したいと考えています。
public class HybridTest {
@Autowired
MyTestSubject myTestSubject;
@Test
public void testWith5LiveServicesAndOneMock(){
MyServiceLive service = myTestSubject.getMyService();
try {
MyService mock = EasyMock.create(...)
myTestSubject.setMyService( mock);
.. do funky test with lots of live but one mock object
} finally {
myTestSubject.setMyService( service);
}
}
}
私は、テストの純粋主義者がこれのために私のいたるところにいることを知っています. しかし、代替案が本当に醜い場合に、非常に実用的なソリューションであることが非常にエレガントであることが時々あります。繰り返しになりますが、通常はギニアに近い場所にあります。