web-dev-qa-db-ja.com

ポートを指定するときにSpringBootActuatorエンドポイントの単体テストが機能しない

最近、スプリングブートのプロパティを変更して、管理ポートを定義しました。そうすることで、私のユニットテストは失敗し始めました:(

/ 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を削除することです。

何か提案/考えはありますか?

ありがとう

11
WHGIBBO

次のアノテーションをテストクラスに追加してみましたか?

@TestPropertySource(properties = {"management.port=0"})

以下のリンクを参照してください

2
Viswanath

同じ問題が発生した場合は、application-test.propertiesにこれを追加してmanagement.portをnullにする必要があります(空の値に設定します)

management.port=

クラスに注釈を付けて、JUnitでテストプロファイルを使用していることを確認してください

@ActiveProfiles("test")
1
flob

物件名に誤りはありませんか? @TestPropertySource(properties = {"management.server.port=..."})の代わりに@TestPropertySource(properties = {"management.port=.."})であってはなりません

1
Diamond

Springブートテストでは、接続する必要のあるポートを指定する必要があります。

デフォルトでは、アクチュエータの場合は異なるserver.portに接続します。

これはによって行うことができます

@SpringBootTest(properties = "server.port=8090")

application.propertiesでは、以下のように管理ポートを指定します

...
management.port=8090
...
0
MirzaM

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();
        }

    }

}    
0

使ってみてください

@SpringBootTest(properties = {"management.port="})

@SpringBootTestアノテーションで定義されたプロパティは、アプリケーションプロパティのプロパティよりも 優先順位が高い です。 "management.port="は、management.portプロパティを「設定解除」します。
これにより、テストでポートを構成することを心配する必要がなくなります。

0
binoternary