我们正在使用spring oauth,在某些地方需要使用继承。

在当前情况下,我们正在扩展TokenEndpoint

public class MyTokenEndpoint extends TokenEndpoint {
    //...
    public ResponseEntity<OAuth2AccessToken> getAccessToken(
            Principal principal,
            MyParams myParams,
            @RequestParam Map<String, String> allParams) {

        // .. Stuff Happens

        updateParamsWithStuff(allParams);

        return super.getAccessToken(
        principal, myParams.grantType(), allParams);
    }
    //...
}


现在我要测试的是传递给super.getAcccessToken的地图是否已填充Stuff。我的简单方法是监视传入的地图,但这依赖于实现细节,实际上并不能确保在super.getAccessToken传递的地图中包含内容。

我们正在使用Mockito,我已经看到有评论说这是行不通的,并且暗示它可能行得通。可以在任何模拟框架中完成此操作吗?

请参阅以下两个答案(Can I mock a superclass's constructor with Mockito/Powermock?,选中的答案说不可能,但是鉴于第二个答案的讨论,我只需要尝试。)

阅读后,我尝试了以下操作:

MyTokenEndpoint spyEndpoint = Mockito.spy(endpoint); //endpoint Set-up previously

Mockito.doAnswer(new Answer<ResponseEntity<OAuth2AccessToken>>() {
    @Override
    public ResponseEntity<OAuth2AccessToken>
           answer(InvocationOnMock invocation) {
       Object[] args = invocation.getArguments();
       Map<String, String> params = (Map<String, String>) args[2];
       System.out.printf("%s\n", params.toString());
       return new ResponseEntity<OAuth2AccessToken>(HttpStatus.ACCEPTED);
    }
}).when(((TokenEndpoint) spyEndpoint))
.getAccessToken(any(Principal.class),
                anyString(), (Map<String, String>) anyMap());

theResponse = spyEndpoint
                .getAccessToken(principal,
                                myPrams,
                                currentMap);


但是答案中的代码永远不会被调用。

我在吠错树吗?在任何模拟框架中都有可能吗?

最佳答案

你为什么要嘲笑?您已经在扩展类-只需重写该方法,检查传入的数据,然后将数据转发给父级即可。

10-08 12:51