8

JMock 中是否有一种已经内置的标准方法来捕获方法参数,以便稍后使用标准 JUnit 功能测试参数对象?

就像是

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

您可以通过实现一个新的 Matcher 来做到这一点,该 Matcher 在调用 match 时捕获参数。这可以稍后检索。

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 回答