2017-06-19 4 views
1

私は3つのユニットテストが含まれている春ブーツで書かれたJUnitテストクラスを持っている:スプリングブートアプリケーションのJUnitテストごとにポート番号を解放する方法は?

@RunWith(SpringRunner.class) 
@SpringBootTest(classes = Application.class) 
@ContextConfiguration 
@DirtiesContext(classMode = ClassMode.AFTER_EACH_TEST_METHOD) 
public class AppclaitionTest { 

    @BeforeClass 
    public static void initialize(){ 
     System.out.println(">>>>>>>Intialization Part!"); 
    } 

    @Test 
    public void test1(){ 
     System.out.println(">>>>>>>Appcliation Test Started! - Test 1"); 
     Application.main(new String[]{}); 
     System.out.println(">>>>>>>Appcliation Test Ended! - Test 1"); 
    } 

    @Test 
    public void test2(){ 
     System.out.println(">>>>>>>Appcliation Test Started! - Test 2"); 
     Application.main(new String[]{}); 
     System.out.println(">>>>>>>Appcliation Test Ended! - Test 2"); 
    } 

    @Test 
    public void test3(){ 
     System.out.println(">>>>>>>Appcliation Test Started! - Test 3"); 
     Application.main(new String[]{}); 
     System.out.println(">>>>>>>Appcliation Test Ended! - Test 3"); 
    } 

    @AfterClass 
    public static void destory(){ 
     System.out.println(">>>>>>>Destroy Part!"); 
    } 
} 

最初のテストの後に実行すると、私は例外の下に取得しています:

java.net.BindException: Address already in use: bind 

アプリケーションコンテキストもののリリース、それはポート番号を解放していない、したがって私は上記の例外を取得しています。

各ユニットテストの前にポート番号を閉じる方法はありますか?

答えて

1

あなたはSpringApplicationクラスを使用して直接ではなく、それを終了するためのAPIを提供していない、あなたの春ブートアプリケーションのmain(String[] args)メソッドを呼び出すことによって、あなたの春のブートアプリケーションを起動する検討すべきです。

SpringApplicationの方法では、実行中のアプリケーションを終了する方法を提供するConfigurableApplicationContextインスタンスを取得できます。例えば

ConfigurableApplicationContext context; 

@Before 
public void setup{ 
    SpringApplication springApplication = new SpringApplicationBuilder()   
      .sources(Application.class) 
      .build(); 
    context = springApplication.run(); 
} 

@After 
public void tearDown(){ 
    SpringApplication.exit(context); 
} 

@Test 
public void test1(){   
    // action 
     ... 
    // assertion 
     ... 
} 

しかし、あなたがやってのこの方法については慎重でなければなりません。
Springブートアプリケーションの起動は比較的高価です。
任意のテスト方法で実行すると、テストの実行が遅くなります。
ユニットテストは速く行う必要があります。
インテグレーションマシン上で実行されている統合テストが遅くなることがあります。
この問題も考慮する必要があります。

+0

SpringApplicationBuilder以前のバージョン(1.1.4)には、アプリケーションをビルドして起動するビルドメソッドが含まれていません。したがって、コードを次のように変更しました。 ソリューション1: context = new SpringApplicationBuilder(Application.class).web(false).run(); 解決方法2: SpringApplicationBuilder app =新しいSpringApplicationBuilder(Application.class); app.sources(Application.class); app.web(false); context = app。run(); いずれの場合も、アプリケーションが起動していません。 –

1

各ユニットテストの前と後のコールを処理する場合は、@After@Beforeを使用します。

+0

各ユニットテストの後にスプリングブートアプリケーションを停止できる方法はありますか? –

+0

あなたのアプリケーションを起動したり停止したりするのに 'SpringApplication'を使う必要があるかもしれません。 – tsolakp

1

複数のspringbootテストのために問題が発生している可能性があり、テストクラスを並行して実行するためにsurefireのようなものを使用している可能性があります。

スプリングブートでは、以下に定義されているように各junitクラスのポートをランダム化できます。しかし、これはクラスレベルでテストレベルではないことに注意してください。

しかし、私は実際にメソッドレベルでの必要性を見ません。 Springbootのテストは遅いので、私はそれに反対するでしょう。

@SpringBootTest(classes = Application.class,webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)

関連する問題