SpringMVCベースのコントローラーの単体テストを試みています。このコントローラーはサービスを呼び出します。そのサービスは実際にはリモートであり、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;
}
}
...
}
スプリング構成は、次のような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がそれを行います。
助けてくれてありがとう!