web-dev-qa-db-ja.com

すべてのスプリングブート@Testで単一の@Configurationクラスをオーバーライドする

私のスプリングブートアプリケーションでは、すべてのテストで、@Configurationクラスの1つだけをテスト構成(特に、@EnableAuthorizationServer@Configurationクラス)でオーバーライドします。

スプリングブートテスト機能 および スプリング統合テスト機能 の概要については、これまでのところ簡単な解決策はありません。

  • @TestConfiguration:オーバーライドではなく拡張用です。
  • @ContextConfiguration(classes=…​)および@SpringApplicationConfiguration(classes =…​)を使用すると、1つのクラスだけでなく、設定全体をオーバーライドできます。
  • @Configuration内の内部@Testクラスは、デフォルトの構成をオーバーライドするために提案されていますが、例は提供されていません。

助言がありますか?

41
NotGaeL

内部テスト構成

テストの内部@Configurationの例:

@RunWith(SpringRunner.class)
@SpringBootTest
public class SomeTest {

    @Configuration
    static class ContextConfiguration {
        @Bean
        @Primary //may omit this if this is the only SomeBean defined/visible
        public SomeBean someBean () {
            return new SomeBean();
        }
    }

    @Autowired
    private SomeBean someBean;

    @Test
    public void testMethod() {
        // test
    }
}

再利用可能なテスト構成

テスト構成を複数のテストに再利用する場合は、Spring Profile @Profile("test")を使用してスタンドアロン構成クラスを定義できます。次に、@ActiveProfiles("test")を使用して、テストクラスでプロファイルをアクティブにします。完全なコードを見る:

@RunWith(SpringRunner.class)
@SpringBootTests
@ActiveProfiles("test")
public class SomeTest {

    @Autowired
    private SomeBean someBean;

    @Test
    public void testMethod() {
        // test
    }
}

@Configuration
@Profile("test")
public class TestConfiguration {
    @Bean
    @Primary //may omit this if this is the only SomeBean defined/visible
    public SomeBean someBean() {
        return new SomeBean();
    }
}

@ Primary

Bean定義の@Primary注釈は、複数のBeanが見つかった場合にこのBeanが優先されるようにするためのものです。

54
alexbt

スプリングブートプロファイル を使用する必要があります。

  1. テスト構成に@Profile("test")の注釈を付けます。
  2. 実動構成に@Profile("production")の注釈を付けます。
  3. プロパティファイルで生産プロファイルを設定します:spring.profiles.active=production
  4. @Profile("test")を使用して、テストクラスにテストプロファイルを設定します。

したがって、アプリケーションの起動時には「プロダクション」クラスを使用し、テストスターの場合は「テスト」クラスを使用します。

内部/ネストされた@Configurationクラスを使用する場合、アプリケーションのプライマリ設定の代わりに使用されます。

11
Slava Babin

最近、アプリケーションの開発バージョンを作成する必要がありました。これは、コマンドライン引数なしで、すぐにdevアクティブプロファイルで実行する必要があります。この1つのクラスを新しいエントリとして追加し、プログラムでアクティブプロファイルを設定することで解決しました。

package ...;

import org.springframework.boot.SpringApplication;
import org.springframework.context.annotation.Import;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.core.env.StandardEnvironment;

@Import(OriginalApplication.class)
public class DevelopmentApplication {
    public static void main(String[] args) {
        SpringApplication application =
            new SpringApplication(DevelopmentApplication.class);
        ConfigurableEnvironment environment = new StandardEnvironment();
        environment.setActiveProfiles("dev");
        application.setEnvironment(environment);
        application.run(args);
    }
}

詳細については、 Arvind RaiによるSpring Boot Profilesの例 を参照してください。

1
Tamas Hegedus