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的全部(翻译:我也不知道)