最近、スプリングブートのプロパティを変更して、管理ポートを定義しました。そうすることで、私のユニットテストは失敗し始めました:(
/ methodsエンドポイントをテストする単体テストを次のように作成しました。
@RunWith (SpringRunner.class)
@DirtiesContext
@SpringBootTest
public class MetricsTest {
@Autowired
private WebApplicationContext context;
private MockMvc mvc;
/**
* Called before each test.
*/
@Before
public void setUp() {
this.context.getBean(MetricsEndpoint.class).setEnabled(true);
this.mvc = MockMvcBuilders.webAppContextSetup(this.context).build();
}
/**
* Test for home page.
*
* @throws Exception On failure.
*/
@Test
public void home()
throws Exception {
this.mvc.perform(MockMvcRequestBuilders.get("/metrics"))
.andExpect(MockMvcResultMatchers.status().isOk());
}
}
以前はこれは通過していました。追加後:
management.port=9001
テストは次のように失敗し始めました:
home Failed: Java.lang.AssertionError: Status expected: <200> but was: <404>
@SpringBootTestアノテーションを次のように変更してみました:
@SpringBootTest (properties = {"management.port=<server.port>"})
Server.portに使用される番号はどこにありますか。これは何の違いも生じなかったようです。
そのため、プロパティファイルのmanagement.port値をserver.portと同じになるように変更しました。同じ結果。
テストを機能させる唯一の方法は、プロパティファイルからmanagement.portを削除することです。
何か提案/考えはありますか?
ありがとう
次のアノテーションをテストクラスに追加してみましたか?
@TestPropertySource(properties = {"management.port=0"})
同じ問題が発生した場合は、application-test.propertiesにこれを追加してmanagement.portをnullにする必要があります(空の値に設定します)
management.port=
クラスに注釈を付けて、JUnitでテストプロファイルを使用していることを確認してください
@ActiveProfiles("test")
物件名に誤りはありませんか? @TestPropertySource(properties = {"management.server.port=..."})
の代わりに@TestPropertySource(properties = {"management.port=.."})
であってはなりません
Springブートテストでは、接続する必要のあるポートを指定する必要があります。
デフォルトでは、アクチュエータの場合は異なるserver.port
に接続します。
これはによって行うことができます
@SpringBootTest(properties = "server.port=8090")
application.properties
では、以下のように管理ポートを指定します
...
management.port=8090
...
Spring Boot 2.xの場合、統合テストの構成を簡略化できます。
たとえば、単純なカスタムheartbeat
エンドポイント
@Component
@Endpoint(id = "heartbeat")
public class HeartbeatEndpoint {
@ReadOperation
public String heartbeat() {
return "";
}
}
このエンドポイントの統合テスト
@SpringBootTest(
classes = HeartbeatEndpointTest.Config.class,
properties = {
"management.endpoint.heartbeat.enabled=true",
"management.endpoints.web.exposure.include=heartbeat"
})
@AutoConfigureMockMvc
@EnableAutoConfiguration
class HeartbeatEndpointTest {
private static final String ENDPOINT_PATH = "/actuator/heartbeat";
@Autowired
private MockMvc mockMvc;
@Test
void testHeartbeat() throws Exception {
mockMvc
.perform(get(ENDPOINT_PATH))
.andExpect(status().isOk())
.andExpect(content().string(""));
}
@Configuration
@Import(ProcessorTestConfig.class)
static class Config {
@Bean
public HeartbeatEndpoint heartbeatEndpoint() {
return new HeartbeatEndpoint();
}
}
}
使ってみてください
@SpringBootTest(properties = {"management.port="})
@SpringBootTest
アノテーションで定義されたプロパティは、アプリケーションプロパティのプロパティよりも 優先順位が高い です。 "management.port="
は、management.port
プロパティを「設定解除」します。
これにより、テストでポートを構成することを心配する必要がなくなります。