我正在使用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")));
}
}
我可能会大胆地猜测您可能正在重用变量,或者拥有一个静态字段等。但是,如果没有看到您的测试代码,没人能告诉。