最近我改变了我的spring boot属性来定义一个管理端口。 这样做,我的单元测试开始失败:(
我编写了一个测试 / metrics 端点的单元测试,如下所示:
@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。
有任何建议/想法吗?
由于
答案 0 :(得分:2)
您是否尝试将以下注释添加到测试类中?
@TestPropertySource(properties = {"management.port=0"})
答案 1 :(得分:1)
如果出现同样的问题,你只需要在application-test.properties中添加它来使management.port为null(将其设置为空值)
management.port=
确保通过使用
注释类来在JUnit中使用测试配置文件@ActiveProfiles("test")
答案 2 :(得分:1)
属性名称是否没有错误?
不应该
@TestPropertySource(properties = {"management.server.port=..."})
代替@TestPropertySource(properties = {"management.port=.."})
答案 3 :(得分:0)
对于Spring启动测试,我们需要指定连接所需的端口。
默认情况下,它连接到server.port
,如果执行器不同。
这可以通过
完成@SpringBootTest(properties = "server.port=8090")
在application.properties
中我们指定管理端口如下
...
management.port=8090
...
答案 4 :(得分:0)
对于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();
}
}
}
答案 5 :(得分:0)
我遇到了同样的问题并尝试了几种方法,但这就是我能够在不更改 application.yaml
执行器端点示例
@Component
@RestControllerEndpoint(id = "endpoint")
public class SampleEndpoint
{
@GetMapping
public String sampleEndpoint(){
return ""
}
}
单元测试用例
@RunWith(SpringRunner.class)
@SpringBootTest(
classes = {SampleEndpointTest.Config.class},
properties = {"management.server.port="}
)
@AutoConfigureMockMvc
public class SampleEndpointTest
{
@Autowired
private MockMvc mockMvc;
@SpringBootApplication(scanBasePackageClasses = {SampleEndpoint.class})
public static class Config
{
}
@Test
public void testSampleEndpoint() throws Exception
{
mockMvc.perform(
MockMvcRequestBuilders.get("/actuator/enpoint").accept(APPLICATION_JSON)
).andExpect(status().isOk());
}
答案 6 :(得分:-1)
尝试使用
@SpringBootTest(properties = {"management.port="})
@SpringBootTest
注释中定义的属性比应用程序属性中的属性higher precedence。 "management.port="
将“取消设置”management.port
属性
这样您就不必担心在测试中配置端口了。