1

我们使用的是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);

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

我在吠叫错误的树吗??这在任何模拟框架中都可能吗?

4

2 回答 2

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"));
   }};
}
于 2012-10-16T12:18:44.580 回答
0

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

于 2012-10-10T19:30:24.767 回答