web-dev-qa-db-ja.com

Spring Boot Test 1.5でランタイムローカルサーバーポートを設定できない

アプリケーションにSpring Boot 1.5を使用しています。統合テストでは、Webサーバーのランタイムポート番号をフェッチしたいと思います(注:私の場合、TestRestTemplateは役に立ちません)。私が試したいくつかのアプローチがありますが、どれもうまくいかないようです。以下は私のアプローチです。

最初のアプローチ

@SpringBootTest(classes = TestConfig.class, webEnvironment =WebEnvironment.DEFINED_PORT)
public class RestServiceTest {

@LocalServerPort      
protected int port;

私のsrc/main/resources/config/application.propertiesファイルで、サーバーポートを次のように定義しました

server.port = 8081

しかし、このコードでエラーが発生しています

値「$ {local.server.port}」のプレースホルダー「local.server.port」を解決できませんでした

セカンドアプローチ

私は変わりました

webEnvironment = WebEnvironment.DEFINED_PORT

webEnvironment = WebEnvironment.RANDOM_PORT

私が定義したsrc/main/resources/config/application.propertiesファイル内

server.port = 0

これは、最初のアプローチと同じエラーをスローします。

番目のアプローチ

3番目のアプローチでは、私が使用しようとしました

protected int port;

@Autowired
Environment environment

this.port = this.environment.getProperty("local.server.port");

これはnull値を返します

4番目のアプローチ

最後に、ApplicationEventsを使用して、EmbeddedServletContainerIntializeをリッスンするイベントリスナーを作成することにより、ポート番号を見つけようとしました

@EventListener(EmbeddedServletContainerInitializedEvent.class)
public void onApplicationEvent(EmbeddedServletContainerInitializedEvent event) {
this.port = event.getEmbeddedServletContainer().getPort();
}

public int getPort() {
return this.port;
} 

同じものをTestConfigに追加しました

今、私のテストクラスでは、このリスナーを使用してポートを取得しようとしました

@SpringBootTest(classes = TestConfig.class, webEnvironment =WebEnvironment.RANDOM_PORT)
public class RestServiceTest {

protected int port;

@Autowired
EmbeddedServletContainerIntializedEventListener embeddedServletcontainerPort;

this.port = this.embeddedServletcontainerPort.getPort();

これは0を返します。また、リスナーイベントがトリガーされないことがわかりました。

ドキュメントや他の投稿のように非常に簡単ですが、どういうわけか私にはうまくいきません。ヘルプは大歓迎です。

10
Meena Chaudhary

テストWeb環境用にランダムなポートを構成するのを忘れたのかもしれません。

これはトリックを行うはずです:@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)

ここでは、テストがSpring Boot 1.5.2で正常に実行されました。

import static org.hamcrest.Matchers.greaterThan;
import static org.junit.Assert.assertThat;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
public class RandomPortTests {

    @Value("${local.server.port}")
    protected int localPort;

    @Test
    public void getPort() {
        assertThat("Should get a random port greater than zero!", localPort, greaterThan(0));
    }

}
13
Kevin Peters

クラスの装飾の上に@RunWith(SpringRunner.class)を置くのを忘れました。

だから、これを試してみてください。

@RunWith(SpringRunner.class)
@SpringBootTest(classes = TestConfig.class, webEnvironment =WebEnvironment.DEFINED_PORT)
public class RestServiceTest {
     @LocalServerPort
     int randomServerPort;
     ...
}
2
Kin Cheung