我们使用的是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,我看到评论说这不起作用,并且暗示它可能会起作用。这可以在任何模拟框架中完成吗?
查看两个答案(我可以使用 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);
但是答案中的代码永远不会被调用。
我在吠叫错误的树吗??这在任何模拟框架中都可能吗?