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

Spring MVC test - Injecting a mock repository when ever the integration test requires a specific type

我使用 spring mvc 3 编写了一个 Web 应用程序。它提供了一个 returns 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);
    }
}

至:

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

和我的网站 xml 映射 url...

来自:

    <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>

至:

    <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>

但是我收到 404 的 http 请求:http://localhost/some/data/1234 我知道 1234 存在的地方。

最重要的是,请求甚至从未到达控制器方法,因此它必须是 Web xml url 模式配置。

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

我试过:

  1. /
  2. /*
  3. /some/data*
  4. /some/data/*

如果您使用的是 Eclipse:

  1. 在服务器视图中双击您的服务器

  1. 转到“模块”选项卡

  1. 检查您的应用程序的路径

最终应用url=路径+some/data/1234

您的 url-模式应该是:

  <servlet-mapping>
        <servlet-name>dataBycode</servlet-name>
        <url-pattern>/</url-pattern>
  </servlet-mapping>

在第二手,你可以尝试访问http://localhost/some/data/myTest并在你的getDataByCode方法中放入一个System.out.println,看看是否调用了该方法。

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