設定済みのbeanでinit-methodを呼び出さずに、JunitテストケースでSpringの設定をテストしたいと思います。テストケースで設定されたシステムプロパティに基づいて実際の作業をスキップするために私のinitメソッドをコーディングすることができましたが、よりクリーンなソリューションを探しています。Spring - 単体テストでのinitメソッドのスキップ
答えて
あなたのJUnitテストは、同じSpringコンテキスト設定ファイルを使用していますか?私は答えが肯定であると推測しています...あなたのテストで代替スプリング設定を使用すると問題が単純化されます。
ので、同様に私が使用したクリーンなアプローチの一つは、いくつかの便利な注釈を利用する。
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
public class MovieServiceTest {
// ...
}
春呼び出し、この「TestContextフレームワーク」とJUnitテストをするために、あるコンテキスト設定ファイルを探します。上記の例では、名前 "MovieServiceTest-context.xml"
あなたはinitメソッドなしでBeanを定義できます。しかし...あなたもそれを試してみませんか?
これはSpringの設定XMLのbeanのinit-method属性で指定されたinitメソッドですか?もしそうなら、これを達成するために実稼働環境で使用するものからテストを実行するために、別のコンテキストXMLを使用できませんでしたか?
あなたは少し古い学校に行き、テストされるクラスを拡張してinitメソッドをオーバーライドすることができます。
また、リファクタリングして、initメソッドが使用するinit戦略オブジェクトを挿入することもできます。
私はtestContext.xmlの道を好むけれども...
が見つかりました。解決策を共有するために自分の質問に答えることにしました。 init-methodsを持たないconfigファイルの別のコピーを維持したままの解決策は嫌いです。私の解決策は完璧ではありませんが、仕事は終わりです。
public final static String INIT_METHOD_REGEX = "init-method=\"\\w+\"";
public final static String DESTROY_METHOD_REGEX = "destroy-method=\"\\w+\"";
public final static String PROPERTY_REGEX = "\\$\\{[^\\}]+\\}";
private static List<List<String>> subs = new ArrayList<List<String>>();
static {
subs.add(Arrays.asList(new String[] { INIT_METHOD_REGEX, "" }));
subs.add(Arrays.asList(new String[] { DESTROY_METHOD_REGEX, "" }));
subs.add(Arrays.asList(new String[] { PROPERTY_REGEX, "" }));
}
static public void testSpringConfig(String configFile) throws IOException {
URL springXml = Thread.currentThread().getContextClassLoader().getResource(configFile);
InputStream is = springXml.openStream();
byte[] buffer = new byte[8192];
int readBytes;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
while ((readBytes = is.read(buffer)) != -1)
baos.write(buffer, 0, readBytes);
String content = baos.toString();
for (List<String> s : subs)
content = content.replaceAll(s.get(0), s.get(1));
ByteArrayInputStream bais = new ByteArrayInputStream(content.getBytes());
InputSource isrc = new InputSource(bais);
GenericApplicationContext ctx = new GenericApplicationContext();
XmlBeanDefinitionReader xmlReader = new XmlBeanDefinitionReader(ctx);
xmlReader.setValidationMode(XmlBeanDefinitionReader.VALIDATION_NONE);
xmlReader.loadBeanDefinitions(isrc);
ctx.refresh();
ctx.start();
ctx.close();
}
このユニットテストまたは統合テストは行われますか?単体テストの場合、コンテキストをロードするべきではないので、initメソッドについて心配する必要はありません。それが統合テストの場合、いくつかのクラス間の相互作用を検証するテストを意味するので、有効なテストを確実にするためにinitメソッドが実際に呼び出されていることを確認する必要があります。
しかし、以前のチャップは頭の爪に当たって、initメソッドを呼び出さない別のコンテキストを使用していました。
- 1. 単体テストWCFメソッド
- 2. 単体テスト$ window resizeメソッド
- 3. Springコントローラで単体テストを実行
- 4. 使い捨てのメソッドの単体テスト
- 5. 単体テストと単体テスト
- 6. Googleのモック単体テスト、静的メソッドC++
- 7. 単体での単体テスト試験
- 8. 別のメソッドを含むメソッドで単体テストを書くには?
- 9. 単体テストはMonoDevelopで単一の[Test]メソッドをテストできますか?
- 10. Djangoで単体テストをスキップしますか?
- 11. 単体テスト:単体テストのメソッドを別の方法で使用しているのですか?
- 12. 単体テスト時のコミット/フラッシュトランザクション?
- 13. 単体テストでスレッドセーフなテスト
- 14. 単体テストでのユニットテスト
- 15. C++での単体テスト
- 16. 単体テストのJavaでのプライベートメソッドと静的メソッド
- 17. BOOST単体テストをスキップする方法は?
- 18. 単体テストは私のアプリケーションで
- 19. 問題ユニット単体テストでのテスト
- 20. NetworkStream paramでメソッドの単体テストを行う方法は?
- 21. 単体テストUrl.Action
- 22. 単体テストMonoDroid
- 23. TableController単体テスト
- 24. 単体テストObservable.interval
- 25. 単体テストNSOperation?
- 26. 単体テスト:カスタムタイマアサート
- 27. Spring RESTコントローラの単体テスト時に@AuthenticationPrincipalを挿入
- 28. Springブートスタンドアロンアプリケーションの単体テストを行う方法は?
- 29. 単体テストでSpring WebClientを模擬する方法
- 30. マルチパートデータと単体テストでSpring MVCファイルをアップロード
+1これは最善のアプローチです。 –
このアプローチについては考えていますが、2バージョンのバネ構成を維持する必要があります。私のバックアップ戦略は、単体テストのprodファイルからすべての "init-method"を取り除き、次にアプリケーションのコンテキストを手動で読み込むことです。よりよい解決策が見つからなければ、私がやろうとしていることかもしれません。 –
これは特にファンキーな機能です。私たちはjunit3に固執し始めましたが、junit4が行く方法です。 –