2

SpringMVCベースのコントローラーの単体テストを試みています。このコントローラーはサービスを呼び出します。そのサービスは実際にはリモートであり、JSON-RPC、具体的にはcom.googlecode.jsonrpc4j.s​​pring.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がそれを行います。

助けてくれてありがとう!

4

3 に答える 3

1

UserController を自分でどこでもインスタンス化していないことに注意してください。spring/spring-mvc がそれを行います。

これは、単体テストを作成していないことを意味します。これは、統合テストとなるスプリング配線をテストしています。単体テストを作成するときは、テスト対象のクラスをインスタンス化し、依存関係を自分で提供します。これにより、クラスの依存関係のモック化されたインスタンスを提供することで、テスト対象のクラスのロジックを分離できます。そこで jmockit の出番です。

于 2013-01-20T21:24:46.997 に答える
1

UserController を単体テストしている場合は、自分でインスタンス化してみませんか。Spring を外に出して、すべてを単独でテストしてください。

ここで UserController をテストするのではなく、Spring の配線とそのリクエスト マッピングをテストします。

于 2013-01-20T20:43:46.893 に答える
0

モックを自分で注入することで問題を解決しました。

@Mocked IdMService service;

@Before
public void setUp() {
 controller.setIdMService(service);
   ...
}
于 2013-02-08T20:07:29.750 に答える