8

メソッドの引数をキャプチャして、後で標準の JUnit 機能を使用して引数オブジェクトをテストするための標準的な方法が JMock に既に組み込まれていますか?

何かのようなもの

final CapturedContainer<SimpleMailMessage>capturedArgumentContainer = new ...
context.checking(new Expectations() {{
    oneOf(emailService.getJavaMailSender()).send(
       with(captureTo(capturedArgumentContainer)));
}});

assertEquals("helloWorld", capturedArgumentContainer.getItem().getBody());

CapturedContainer存在しcaptureToません—それらは私が求めているものです。

それとも、これを自分で実装する必要がありますか?

4

3 に答える 3

11

これを行うには、match が呼び出されたときに引数を取得する新しい Matcher を実装します。これは後で取得できます。

class CapturingMatcher<T> extends BaseMatcher<T> {

  private final Matcher<T> baseMatcher;

  private Object capturedArg;

  public CapturingMatcher(Matcher<T> baseMatcher){
    this.baseMatcher = baseMatcher;
  }

  public Object getCapturedArgument(){
    return capturedArg;
  }

  public boolean matches(Object arg){
    capturedArg = arg;
    return baseMatcher.matches(arg);
  }

  public void describeTo(Description arg){
    baseMatcher.describeTo(arg);
  }
}

次に、期待値を設定するときにこれを使用できます。

final CapturingMatcher<ComplexObject> captureMatcher 
  = new CapturingMatcher<ComplexObject>(Expectations.any(ComplexObject.class));

mockery.checking(new Expectations() {{
      one(complexObjectUser).registerComplexity(with(captureMatcher));
}});

service.setComplexUser(complexObjectUser);

ComplexObject co = 
  (ComplexObject)captureMatcher.getCapturedArgument();

co.goGo();
于 2011-12-02T15:42:18.970 に答える
4

私はあなたがここでポイントを少し逃していると思います. アイデアは、それをキャプチャして後でチェックするのではなく、何が起こるべきかを期待して指定することです。それは次のようになります。

context.checking(new Expectations() {{
    oneOf(emailService.getJavaMailSender()).send("hello world");
}});

または、より緩い状態の場合は、

context.checking(new Expectations() {{
    oneOf(emailService.getJavaMailSender()).send(with(startsWith("hello world")));
}});
于 2011-06-24T22:57:33.553 に答える
0

モックに渡されたオブジェクトのフィールドをチェックしたいという同様の状況に陥りました。Mark が説明するようにキャプチャーマッチャーを使用する代わりに、私はより JMock の方法と思われる方法を試しました。ユースケースに合わせて調整されたコード:

mockery.checking(new Expectations() {{
  oneOf(emailService.getJavaMailSender()).send(
    with(Matchers.<SimpleMailMessage>hasProperty("body", equal("Hello world!"))));
}});

これには制限があることは理解していますが、ほとんどの場合、hamcrest マッチャーは問題のオブジェクトを十分にテストできるはずです。お役に立てれば。

于 2016-03-15T09:38:57.003 に答える