アプリケーションに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
を返します。また、リスナーイベントがトリガーされないことがわかりました。
ドキュメントや他の投稿のように非常に簡単ですが、どういうわけか私にはうまくいきません。ヘルプは大歓迎です。
テスト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));
}
}
クラスの装飾の上に@RunWith(SpringRunner.class)
を置くのを忘れました。
だから、これを試してみてください。
@RunWith(SpringRunner.class)
@SpringBootTest(classes = TestConfig.class, webEnvironment =WebEnvironment.DEFINED_PORT)
public class RestServiceTest {
@LocalServerPort
int randomServerPort;
...
}