尝试使用模拟执行简单测试时出现意外错误。
@RunWith(MockitoJUnitRunner)
class AccessorTest {
@Mock
private DeviceBuilder deviceBuilder
@Test
void shouldCreateDeviceFromFilesystem() {
//given
URI uri = this.class.classLoader.getResource("sample-filesystem").toURI()
File deviceRoot = new File(uri)
Accessor accessor = new Accessor(deviceBuilder)
Device expectedDevice = new Device(deviceRoot)
when(deviceBuilder.build(eq(deviceRoot))).thenReturn(expectedDevice)
//when
Device device = accessor.readFrom(deviceRoot)
//then
assert device == expectedDevice
verify(deviceBuilder).build(deviceRoot)
}
}
DeviceBuilder是单个方法接口Device :: DeviceBuilder #build(文件根目录)。根据Josh Bloch,Device有一个定义良好的equals方法。
在when()行上抛出异常,并且范围中的所有变量都不为null。完整的例外是:
org.mockito.exceptions.misusing.InvalidUseOfMatchersException:
Invalid use of argument matchers!
0 matchers expected, 1 recorded.
This exception may occur if matchers are combined with raw values:
//incorrect:
someMethod(anyObject(), "raw String");
When using matchers, all arguments have to be provided by matchers.
For example:
//correct:
someMethod(anyObject(), eq("String by matcher"));
这是值得的,这是我POM的片段:
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<compilerId>groovy-eclipse-compiler</compilerId>
</configuration>
<dependencies>
<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy-eclipse-compiler</artifactId>
<version>2.7.0-01</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy-all</artifactId>
<version>2.0.4</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-all</artifactId>
<version>1.8.5</version>
<scope>test</scope>
</dependency>
</dependencies>
我怀疑是Groovy管理类的方式有些奇怪,或者是某些版本不兼容,但我希望这是我看不见的显而易见的东西。
答案 0 :(得分:2)
我知道这是一个老问题,但这可能对其他人有帮助。
问题中描述的问题详见http://code.google.com/p/mockito/issues/detail?id=303
我遇到了同样的问题,我使用https://github.com/cyrusinnovation/mockito-groovy-support
提供的库修复了这个问题答案 1 :(得分:0)
有时Mockito在发生时不会标记不恰当的用途,但会在下次调用时使用。你可以在那之前看一下测试,也许你有问题吗?
消息说,在调用中,您必须只提供Matchers或仅提供真实对象,而不是它们的组合。您通常可以通过使用eq(obj)而不是对象本身(或sameInstance(obj))来修复它,以获得所有Matchers。但是,在这种情况下,我发现您发布的代码中没有任何符合该描述的地方,这就是为什么我怀疑代码的早期位置存在问题。
答案 2 :(得分:-1)
我没有回答原来的问题。
我到处搜索过,关于我得到的错误的唯一问题就是这个问题。
如果有人遇到此错误:请勿调用mock方法为匹配器提供值。致电deviceBuilder.build
应该在verify(
之前进行。