我正在我们现有的Db api之上编写一个模拟层(它不能被遗憾地改变)。我设想了特定于某些表函数的模拟,最初只是关注表名。
when(mockDbApi.query(argThat(new TableNameMatcher("table1")))).thenReturn(result);
查询函数采用QueryDescriptor的参数。我的TableArgumentMatcher类如下:
public static class TableNameMatcher extends ArgumentMatcher<QueryDescriptor> {
private String tableName;
public TableNameMatcher(String tableName) {
this.tableName = tableName;
}
@Override
public boolean matches(Object argument) {
if (argument instanceof QueryDescriptor) {
QueryDescriptor qDescript = (QueryDescriptor) argument;
return qDescript.getBaseTable().equals(tableName);
}
return false;
}
}
尝试这个,我最终会得到一个异常转储(框架很好并且为我自定义渲染堆栈跟踪):
org.mockito.exceptions.misusing.InvalidUseOfMatchersException
org.mockito.exceptions.misusing.InvalidUseOfMatchersException:
Misplaced argument matcher detected here:
at com.company.CommonsTestDb.mockQuery(CommonsTestDb.java:88)
You cannot use argument matchers outside of verification or stubbing.
Examples of correct usage of argument matchers:
when(mock.get(anyInt())).thenReturn(null);
doThrow(new RuntimeException()).when(mock).someVoidMethod(anyObject());
verify(mock).someMethod(contains("foo"))
CommonsTestDb第88行是我在上面列出的()时做同样的事情。请注意,代码确实编译干净,并没有警告我任何类型问题。
思考?我看到许多个人被重定向到使用捕获功能并稍后验证匹配的例子但是我不认为它适用于各种表格的条款时它们可能是多个。
谢谢,