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 ответ

Вы можете достичь этого несколькими способами, вот два из них:

  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();
        }
    }
    
  2. Введите его, используя @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();
        }
    }
    
Другие вопросы по тегам