Spring MVC测试 - 在集成测试需要特定类型时注入模拟存储库

Jer*_*emy 5 java path-variables spring-mvc url-pattern

我使用spring mvc 3编写了一个Web应用程序.它提供了一个返回JSON的单个端点.我确实使用url参数成功运行它,但现在我需要更改它以使用路径变量.

我换了控制器

从:

@Controller
public class DataController {

    @Autowired
    private IDataService dateService;

    @RequestMapping(
            value = "/some/data",
            method = RequestMethod.GET,
            produces = "application/json"
    )
    public @ResponseBody Data getDataByCode(@RequestParam String code) {
        return versionService.getDataByCode(code);
    }
}
Run Code Online (Sandbox Code Playgroud)

至:

@Controller
public class DataController {

    @Autowired
    private IDataService dateService;

    @RequestMapping(
            value = "/some/data/{code}",
            method = RequestMethod.GET,
            produces = "application/json"
    )
    public @ResponseBody Data getDataByCode(@PathVariable String code) {
        return versionService.getDataByCode(code);
    }
}
Run Code Online (Sandbox Code Playgroud)

和我的web xml来映射网址...

从:

    <servlet>
        <servlet-name>dataBycode</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:/config/servlet-config.xml</param-value>
        </init-param>
    </servlet>

    <servlet-mapping>
        <servlet-name>dataBycode</servlet-name>
        <url-pattern>/some/data</url-pattern>
    </servlet-mapping>
Run Code Online (Sandbox Code Playgroud)

至:

    <servlet>
        <servlet-name>dataBycode</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:/config/servlet-config.xml</param-value>
        </init-param>
    </servlet>

    <servlet-mapping>
        <servlet-name>dataBycode</servlet-name>
        <url-pattern>/some/data/*</url-pattern>
    </servlet-mapping>
Run Code Online (Sandbox Code Playgroud)

但我得到了一个404的http请求:http://localhost/some/data/1234 我知道1234存在.

最重要的是,请求永远不会进入控制器方法,因此它必须是web xml url模式配置.

作为测试,我尝试更改url模式以使请求与代码完全匹配,并按预期返回JSON,因此我知道它的url模式.我只是不知道如何解决它.

我试过了:

  1. /
  2. /*
  3. /一些数据*
  4. /一些数据/*

fab*_*lle 1

您的 url 模式应该是:

  <servlet-mapping>
        <servlet-name>dataBycode</servlet-name>
        <url-pattern>/</url-pattern>
  </servlet-mapping>
Run Code Online (Sandbox Code Playgroud)

另一方面,您可以尝试访问http://localhost/some/data/myTest并将 System.out.println 放入您的 getDataByCode 方法中以查看该方法是否被调用。

如果它有效,我认为问题来自 Spring MVC,它将“1234”解释为整数而不是字符串。