1

私たちは春の 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.getAccessToken に渡されたマップが Stuff で満たされているかどうかです。私の簡単な方法は、渡されたマップをスパイすることでしたが、これは実装の詳細に依存しており、super.getAccessToken に渡されたマップにものが含まれていることを実際に保証するものではありません。

私たちは Mockito を使用していますが、これは機能しないというコメントと、機能する可能性があることを示唆するコメントを見てきました。これは、どのモッキング フレームワークでも実行できますか?

両方の回答を参照してください ( Can I mock a superclass's constructor with Mockito/Powermock?、チェックされたものは不可能と言っていますが、2番目の回答に関する議論を考えると、試してみました。)

それを読んだ後、私は次のことを試しました:

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

なぜ嘲笑する必要があるのですか?すでにクラスを拡張しています。そのメソッドをオーバーライドし、渡されたデータを調べてから、データを親に転送します。

于 2012-10-10T19:30:24.767 に答える
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 に答える