Java 覆盖Mockito toString测试输出
我已经写了一个习惯用法 可以说,我想“重写Java 覆盖Mockito toString测试输出,java,junit,mockito,hamcrest,Java,Junit,Mockito,Hamcrest,我已经写了一个习惯用法 可以说,我想“重写toString()”方法,这样,如果出现故障,错误就会更加详细。以下是JUnit失败跟踪: Argument(s) are different! Wanted: dependedOnComponent.method( <Double matcher> ); -> at my.domain.TestClass.testMethod(TestClass.java:123) Actual invocation has differe
toString()
”方法,这样,如果出现故障,错误就会更加详细。以下是JUnit失败跟踪:
Argument(s) are different! Wanted:
dependedOnComponent.method(
<Double matcher>
);
-> at my.domain.TestClass.testMethod(TestClass.java:123)
Actual invocation has different arguments:
dependedOnComponent.method(
123.45,
);
-> at my.domain.SystemUnderTest.callingMethod(SystemUnderTest.java:456)
参数不同!通缉:
dependedOnComponent.method(
);
->在my.domain.TestClass.testMethod(TestClass.java:123)中
实际调用有不同的参数:
dependedOnComponent.method(
123.45,
);
->在my.domain.SystemUnderTest.callingMethod(SystemUnderTest.java:456)中
如您所见,它打印
。是否可以覆盖该消息?相反,作为一个例子,我希望看到:
Argument(s) are different! Wanted:
dependedOnComponent.method(
120 < matcher < 121
);
参数不同!通缉:
dependedOnComponent.method(
120
但我的matcher类的另一个实例可能是:
Argument(s) are different! Wanted:
dependedOnComponent.method(
1 < matcher < 200
);
参数不同!通缉:
dependedOnComponent.method(
1
我不需要知道如何编写代码来生成数字或语法,我只需要知道将其放置在何处。尝试以下操作:
@RunWith(MockitoJUnitRunner.class)
public class SOTest {
public interface Foo {
void doSomething(double d);
}
@Test
public void sillyTest() {
Foo foo = mock(Foo.class);
foo.doSomething(1);
verify(foo).doSomething(Mockito.doubleThat(new TestMatcher(2)));
}
public class TestMatcher extends CustomMatcher<Double> {
private final double expected;
public TestMatcher(double expected) {
super(Double.toString(expected));
this.expected = expected;
}
@Override
public boolean matches(Object item) {
return item instanceof Double && ((Double) item).equals(expected);
}
}
}
所以我做了些傻事;我在读Javadoc的时候,我真的应该看Javadoc的 一旦我意识到我的错误,这很容易;只需重写该接口中定义的
descripeTo
方法,例如
@Override
public void describeTo(Description description) {
description.appendText(String.valueOf(expected));
description.appendText(" ± ");
description.appendText(String.valueOf(delta));
}
对不起,我应该说明我想根据不同的实例更改消息谢谢你的帮助,我最终完成了我在回答中描述的操作。但是,您肯定让我走上了正确的道路(因为我意识到我没有实现
Matcher
,而是扩展了ArgumentMatcher
),所以我给了你一票:)关于你对我现在删除的帖子的评论-你能扩展你的问题,给出一个你想要实现的例子吗?更新的答案应该解决这个问题。本质上是相同的解决方案,尽管描述得更好:-)IIRC,期望您将扩展CustomMatcher
(根据我的回答),而不是ArgumentMatcher
。在扩展该类时不可能犯这种“错误”,因为构造函数强制您定义描述。写了上面的评论后,我发现ArgumentMatcher
的Javadocs有些不同意我的观点。哦,好吧:-)邓肯-耶,这是莫基托的事,不是朱尼特的事;)奇怪的是,他们创建了一个与Hamcrest的CustomMatcher
类基本相同的类。我想知道他们为什么这么做——也许只是为了避免人们宣称对汉克雷斯特的依赖。@Duncan注意到这是mockito的核心,而不是mockito的全部(翻译:我也不知道)