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

标签 java spring spring-mvc junit

我有一个简单的 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/

相关文章:

java - 如何记录来自 @RestController 的任何传出响应?

java - Selenide ElementsCollection 抛出 StaleElementException

java - Java Hash Map中可以存储50mb的字符串类型键值对数据吗

java - Spring junit 测试模板可能不存在

java - 如何发送base64格式的大文件?

java - 简单的Sql查询到Hibernate查询

java - 如何在Spring中使用@Transactional实现真正的事务

java - Spring 中的多部分文件下载?

java - 将 Spring Boot 部署到 Wildfly 10

java - 如何使 Spring Joda-Time 格式化程序在非标准语言环境下工作?