我有一个简单的Spring MVC控制器,其RequestMapping是一个属性。这是一个包含控制器的jar。下游应用程序将使用此jar并使用公共端点,只有精确的URL可能因app而异
当我将jar包含到另一个应用程序中时,一切正常。该应用程序有一个属性或yaml文件,并设置属性。我已经验证端点工作正常。
但是,作为一名优秀的开发人员,我想进行集成测试,以验证属性确定的URL是否正确公开。我可以正确地注入控制器中的@Value,但@RequestMapping中的$ {}表达式不会从属性文件中替换。我找到了几个帖子(Spring Boot REST Controller Test with RequestMapping of Properties Value和@RequestMapping with placeholder not working)但要么他们不申请,要么我尝试了他们说的话,我无法让它发挥作用。
命中静态(iWork)端点的测试有效,但从属性(iDontWork)中提取的测试不起作用。
(这是春季4.2.6)
@RestController
@RequestMapping(value = {"/${appName}", "/iWork"})
public class Controller {
@Value("${appName}")
private String appName;
@RequestMapping(method= RequestMethod.GET)
public String handlerMethod (HttpServletRequest request) throws Exception {
// Proves the placeholder is injected in the class, but
// Not in the RequestMapping
assert appName != null;
assert !appName.equals("${appName}");
return "";
}
}
@WebAppConfiguration
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(loader = AnnotationConfigWebContextLoader.class,
classes = { ControllerTest.Config.class })
public class ControllerTest {
@Autowired
private WebApplicationContext context;
private MockMvc mvc;
@Before
public void setup() {
mvc = MockMvcBuilders
.webAppContextSetup(context)
.build();
}
@Configuration
@ComponentScan(basePackages = {"test"})
static class Config {
// because @PropertySource doesnt work in annotation only land
@Bean
PropertyPlaceholderConfigurer propConfig() {
PropertyPlaceholderConfigurer ppc = new PropertyPlaceholderConfigurer();
ppc.setLocation(new ClassPathResource("test.properties"));
return ppc;
}
}
@Test
public void testStaticEndpoint() throws Exception {
mvc.perform(get("/iWork")).andExpect(status().isOk());
}
@Test
public void testDynamicEndpoint() throws Exception {
mvc.perform(get("/iDontWork")).andExpect(status().isOk());
}
}
appName = iDontWork
答案 0 :(得分:2)
你“只是”缺少
@EnableWebMvc
在@Configuration
课程上。没有它,Spring的Mock MVC堆栈将使用DefaultAnnotationHandlerMapping
注册您的控制器处理程序方法,这不足以解析@RequestMapping
中的占位符。
如果你做提供它,Mock MVC将使用RequestMappingHandlerMapping
,这是。
答案 1 :(得分:0)
您需要在创建mockMvc时添加占位符值,如下所示。
@Before
public void setup() {
MockitoAnnotations.initMocks(this);
mockMvc = MockMvcBuilders.standaloneSetup(accountController)
.addPlaceholderValue("propertyName", "propertyValue")
.build();
}