我正在使用Mockito进行单元测试,并且正在使用ArgumentMatcher来检查参数的特定字段是否具有特定值。

我有一个StatusMatcher类,该类扩展了ArgumentMatcher并检查类MyClass的对象在状态字段中是否具有特定值。我在测试中调用此方法的方式是:

verify(myDAO, times(1)).update(argThat(new StatusMatcher("SomeStatus")));

这里update是使用某些MyClass对象调用的DAO的方法。我想看看它的状态是否正确。这是我得到的:
Argument(s) are different! Wanted:
myDAO.update(
    <Status matcher>
);
-> at com.foo.bar.MyTest.test1
Actual invocation has different arguments:
myDAO.update(
    com.foo.bar.MyClass
);

请注意,这对于除一个测试用例之外的所有测试用例都非常有效。因此,我知道StatusMatcher等已正确编码。我不确定获取此异常的方法有什么不同。

我想知道的是:在什么条件下ArgumentMatcher会抛出这种异常,这样我就可以找出丢失的内容(不是我粘贴实际的方法代码)
如果解释不够清楚,请告诉我,我将尽力加以改进。感谢您阅读本文:)

编辑:这是我的StatusMatcher类的代码
    private class StatusMatcher extends ArgumentMatcher<MyClass> {

    private String status;
    public StatusMatcher(String hs) {
        status = hs;
    }

    @Override
    public boolean matches(Object argument) {

        return status.equals(((MyClass)argument).getStatus());
    }
}

最佳答案

如您所说,它失败是因为参数不同。看一下下面的测试,您会发现第二种测试方法将失败,因为MyClass实例中的状态与您在匹配器中传递的SomeStatus不同。

public class MatcherTest {

    class MyClass{
        private String status;

        MyClass(String status) {
            this.status = status;
        }

        public String getStatus(){
            return status;
        }
    }

    class MyDao {
        public void update(MyClass myClass){}
    }

    class StatusMatcher extends ArgumentMatcher<MyClass> {
        private String status;
        public StatusMatcher(String hs) {
            status = hs;
        }

        @Override
        public boolean matches(Object argument) {
            return status.equals(((MyClass)argument).getStatus());
        }
    }

    @Test
    public void shouldMatchStatus(){
        MyDao mock = mock(MyDao.class);
        mock.update(new MyClass("expectedStatus"));
        verify(mock, times(1)).update(argThat(new StatusMatcher("expectedStatus")));
    }

    @Test
    public void shouldNotMatchStatus(){
        MyDao mock = mock(MyDao.class);
        mock.update(new MyClass("unexpectedStatus"));
        /* THE BELLOW WILL FAIL BECAUSE ARGUMENTS ARE DIFFERENT */
        verify(mock, times(1)).update(argThat(new StatusMatcher("expectedStatus")));
    }
}

我可能会大胆地猜测您可能正在重用变量,或者拥有一个静态字段等。但是,如果没有看到您的测试代码,没人能告诉。

09-30 17:53
查看更多