gpt4 book ai didi

java - RequestMapping 占位符在 JUnit 测试中不起作用

转载 作者:行者123 更新时间:2023-11-30 08:01:04 24 4
gpt4 key购买 nike

我有一个简单的 Spring MVC Controller ,其 RequestMapping 是一个属性。这是一个包含 Controller 的 jar 。下游应用程序将使用这个 jar 并使用公共(public)端点,只有精确的 URL 可以因应用程序而异)

当我将我的 jar 包含到另一个应用程序时,一切正常。该应用程序具有属性或 yaml 文件,并且该属性已设置。我已验证端点工作正常。

但是,作为优秀的开发人员,我想进行集成测试以验证由属性确定的 URL 是否已正确公开。我可以在 Controller 中正确注入(inject)一个@Value,但是@RequestMapping 中的${} 表达式不会从属性文件中替换。我找到了几个线程(Spring Boot REST Controller Test with RequestMapping of Properties Value@RequestMapping with placeholder not working),但要么它们不适用,要么我尝试了他们所说的但我无法让它工作。

命中静态 (iWork) 端点的测试有效,但从属性 (iDontWork) 中提取的测试无效。

(这是 Spring 4.2.6)

Controller

@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 "";
}
}

Controller 测试

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

测试.properties

appName = iDontWork

最佳答案

你“只是”失踪了

@EnableWebMvc

在您的@Configuration 类上。没有它,Spring 的 Mock MVC 堆栈将使用 DefaultAnnotationHandlerMapping 注册您的 Controller 处理程序方法,这不够智能,无法解析 @RequestMapping 中的占位符。

如果您确实提供它,Mock MVC 将改为使用RequestMappingHandlerMapping,即。

关于java - RequestMapping 占位符在 JUnit 测试中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38023629/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com