我正在尝试对基于 Spring MVC 的控制器进行单元测试。此控制器调用服务。该服务实际上是远程的,并且通过 JSON-RPC 暴露给控制器,特别是 com.googlecode.jsonrpc4j.spring.JsonProxyFactoryBean
控制器具有:
@Controller
@RequestMapping("/users")
public class UserController {
/**
* ID manager service that will be used.
*/
@Autowired
IdMService idMService;
...
@ResponseBody
@RequestMapping(value = "/{userId}", method = GET)
public UserAccountDTO getUser(@PathVariable Long userId, HttpServletResponse response) throws Exception {
try {
return idMService.getUser(userId);
} catch (JsonRpcClientException se) {
sendJsonEncodedErrorRepsonse(response, se);
return null;
}
}
...
}
spring 配置像这样提供 IdMService:
<!-- Create the proxy for the Access Control service -->
<bean class="com.googlecode.jsonrpc4j.spring.JsonProxyFactoryBean">
<property name="serviceUrl" value="${access_control.service.url}" />
<property name="serviceInterface" value="com.phtcorp.service.accesscontrol.IdMService" />
</bean>
因此,注入控制器的 IdMService 实际上是一个 JSON-RPC 代理,实现了 IdMService 接口。
我想测试控制器,但模拟 IdMService。我有这个:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:/test-context.xml" })
@SuppressWarnings("javadoc")
public class TestUserController {
@Autowired
private ApplicationContext applicationContext;
private HandlerAdapter handlerAdapter;
private MockHttpServletRequest request;
private MockHttpServletResponse response;
@Mocked IdMService service;
@Test
public void getUser() throws Exception {
request.setMethod(RequestMethod.GET.name());
request.setRequestURI("/users/1");
HandlerMethod handler = (HandlerMethod) getHandler(request);
handlerAdapter.handle(request, response, handler);
new Verifications() {{
service.getUser(1L); times=1;
}};
}
...
}
但是,我发现注入控制器的 IdMService 不是模拟的,它毕竟是 JsonRpcProxy。我已经以这种方式成功地测试了一个不同的控制器,但是那个控制器并没有使用代理到它的服务。
所以问题是:如何使用 jmockit 将模拟 IdMService 注入到 UserController 中?请注意,我没有在任何地方自己实例化 UserController;spring/spring-mvc 就是这样做的。
谢谢你的帮助!