我们正在使用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);
但是答案中的代码永远不会被调用。
我疯了吗?这在任何模拟框架中都可以吗?答案 0 :(得分:0)
为什么你需要嘲笑?您已经在扩展该类 - 只需覆盖该方法,检查传入的数据,然后将数据转发给父级。
答案 1 :(得分:0)
这样的测试可以用JMockit轻松编写:
@Test
public void mockCallToSuper(@Mocked final TokenEndpoint mockedBase)
{
final Principal principal = null; // or whatever
MyParams myParams = new MyParams();
Map<String, String> params = new HashMap<String, String>();
ResponseEntity<OAuth2AccessToken> accessToken =
new MyTokenEndpoint().getAccessToken(principal, myParams, params);
// asserts on "accessToken"
new Verifications() {{
Map<String, String> actualParams;
mockedBase.getAccessToken(
principal, (MyParams) any, actualParams = withCapture());
assertEquals("abc", actualParams.get("A"));
assertEquals("another item", actualParams.get("B2"));
}};
}