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 模式。我只是不知道如何解决它。
我试过:
- /
- /*
- /some/data*
- /some/data/*
如果您使用的是 Eclipse:
- 在服务器视图中双击您的服务器
- 转到“模块”选项卡
- 检查您的应用程序的路径
最终应用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”解释为整数而不是字符串。
我使用 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 模式。我只是不知道如何解决它。
我试过:
- /
- /*
- /some/data*
- /some/data/*
如果您使用的是 Eclipse:
- 在服务器视图中双击您的服务器
- 转到“模块”选项卡
- 检查您的应用程序的路径
最终应用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”解释为整数而不是字符串。