1. ホーム
  2. java

[解決済み] 統合テストでのBeanのオーバーライド

2023-06-06 14:22:41

質問

私の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個あります。デフォルトのコンテキストはうまく再利用されています