Spring Boot: как внедрить server.contextPath из application.properties в MockServletContext
В application.properties я настроил server.contextPath=/app-service
,
К сожалению, этого значения нет в контексте теста:
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = { Application.class, SwaggerConfig.class })
@WebAppConfiguration
public class Swagger2MarkupTest {
@Autowired
private WebApplicationContext context;
private MockMvc mockMvc;
@Before
public void setUp() {
this.context.getServletContext().getContextPath(); // null
this.mockMvc = MockMvcBuilders.webAppContextSetup(this.context).build();
}
}
Мне нужен contextPath для Swagger Docket, который использует по умолчанию springfox.documentation.spring.web.paths.RelativePathProvider
который определяет contextPath
@Override
protected String applicationPath() {
return isNullOrEmpty(servletContext.getContextPath()) ? ROOT : servletContext.getContextPath();
}
Все дело в RelativePathProvider, который вызывается намного раньше, чем модульный тест. Речь идет не о внедрении contextPath в сам модульный тест, поскольку уже поздно, поскольку RelativePathProvider уже вызван servletContext.getContextPath()
для конфигурации Swagger.
1 ответ
Вы можете достичь этого несколькими способами, вот два из них:
Залить весной
Environment
и получить значение свойства:@RunWith(SpringJUnit4ClassRunner.class) @SpringBootTest(classes = { Application.class, SwaggerConfig.class }) @WebAppConfiguration public class Swagger2MarkupTest { @Autowired private WebApplicationContext context; @Autowired private Environment environment; private MockMvc mockMvc; @Before public void setUp() { environment.getProperty("server.contextPath"); // should return /app-service this.mockMvc = MockMvcBuilders.webAppContextSetup(this.context).build(); } }
Введите его, используя
@Value
:@RunWith(SpringJUnit4ClassRunner.class) @SpringBootTest(classes = { Application.class, SwaggerConfig.class }) @WebAppConfiguration public class Swagger2MarkupTest { @Autowired private WebApplicationContext context; @Value("server.contextPath") private String contextPath; // should populate with /app-service private MockMvc mockMvc; @Before public void setUp() { this.mockMvc = MockMvcBuilders.webAppContextSetup(this.context).build(); } }