[解決済み] 統合テストでのBeanのオーバーライド
質問
私のSpring-Bootアプリでは、@Configurationファイルを通してRestTemplateを提供し、賢明なデフォルト(例:タイムアウト)を追加することができます。私の統合テストでは、私は外部サービスに接続したくないので、RestTemplateをモックしたいと思います - 私は期待する応答がわかっています。私は、後者が実際の実装をオーバーライドすることを期待して、integration-testパッケージで異なる実装を提供しようとしましたが、ログをチェックすると、それは他の方法です:実際の実装がテストのものをオーバーライドしています。
TestConfigのものが使用されていることを確認するにはどうしたらよいでしょうか?
これは私の設定ファイルです。
@Configuration
public class RestTemplateProvider {
private static final int DEFAULT_SERVICE_TIMEOUT = 5_000;
@Bean
public RestTemplate restTemplate(){
return new RestTemplate(buildClientConfigurationFactory());
}
private ClientHttpRequestFactory buildClientConfigurationFactory() {
HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();
factory.setReadTimeout(DEFAULT_SERVICE_TIMEOUT);
factory.setConnectTimeout(DEFAULT_SERVICE_TIMEOUT);
return factory;
}
}
統合テストです。
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = TestConfiguration.class)
@WebAppConfiguration
@ActiveProfiles("it")
public abstract class IntegrationTest {}
TestConfigurationクラスです。
@Configuration
@Import({Application.class, MockRestTemplateConfiguration.class})
public class TestConfiguration {}
そして最後にMockRestTemplateConfigurationです。
@Configuration
public class MockRestTemplateConfiguration {
@Bean
public RestTemplate restTemplate() {
return Mockito.mock(RestTemplate.class)
}
}
どのように解決するのですか?
Spring Boot 1.4.x以降では、Spring Bootで使用できるオプションとして
@MockBean
アノテーションを使用してSpring Beanを偽装するオプションがあります。
コメントに対する反応です。
キャッシュにコンテキストを保持するために
@DirtiesContext
を使わず
@ContextConfiguration(name = "contextWithFakeBean")
を使うと、デフォルトのコンテキストをキャッシュに残しながら、別のコンテキストを作成します。Springは両方(あるいはいくつのコンテキストがあるか)をキャッシュに保存します。
私たちのビルドはこの方法で、ほとんどのテストはデフォルトのノンポリューション設定を使用していますが、ビーンを偽装しているテストが4-5個あります。デフォルトのコンテキストはうまく再利用されています
関連
-
NullPointerException - java.lang.
-
スレッド "main "での例外 java.util.NoSuchElementException in Java 問題解決済み
-
Javaクラスが "Error occurred during initialization of boot layer "というエラーで実行される。
-
Javaがテキストファイルを読み込む
-
XXX型を囲むインスタンスがJavaでアクセスできない
-
Javaがリソースリークに遭遇した:'input'が閉じない 解決方法
-
eclipse 実行 Java、エラー: 選択を起動できず、レシーバーもありません。
-
[解決済み] JUnit 4のテストで、ある例外が投げられたことをどのように断言しますか?
-
[解決済み] テストなしでGradleビルド
-
[解決済み] 春豆っていったい何?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Springの設定でxsdファイルのバージョン番号を設定しない方が良い理由
-
Javaクラスが "Error occurred during initialization of boot layer "というエラーで実行される。
-
ブートレイヤーの初期化中にエラーが発生しました java.lang.module.FindException: モジュールが見つかりません
-
ajax コミット リソースの読み込みに失敗しました: サーバーはステータス 400 で応答しました ()
-
名前 'XXX' を持つ Bean の作成に失敗しました。自動依存関係の注入に失敗しました 解決方法
-
BindException: アドレスはすでに使用中です:バインドエラー解決
-
アノテーション「@Retention」の役割
-
Java appears タイプEを囲むインスタンスがアクセスできない。
-
java 365*1000*60*60*24 計算問題
-
テストが空であるかどうかを判断するためのオプションの処理