在Mockito和Groovy 2.0.4中设置期望时,InvaliduseOfMatchersException



我在尝试使用模拟的简单测试时遇到了出乎意料的错误。

@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#build(文件root)。设备根据Josh Bloch具有良好的定义等效方法。

例外是在()线上抛出的,并且范围中的任何变量都不为空。完整的例外是:

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管理上课的方式,要么是某种版本不兼容,但我希望这很明显我看不到。

我知道这是一个古老的问题,但这可能对别人有帮助。

问题中描述的问题在http://code.google.com/p/mockito/issues/detail?id=303

我遇到了同一个问题,我使用https://github.com/cyrusinnovation/mockito-groovy-support

来修复它。

有时Mockito在出现时不适合使用不适当的用途,而是在下一个调用中。您可以在那个测试之前看一下测试,也许您在那里有问题?

消息说,在调用中,您要么只提供匹配器或仅提供真实对象,而不是其组合。通常,您可以使用EQ(OBJ)代替对象本身(或sameinstance(obj))来解决该问题,以具有所有匹配器。但是,在这种情况下,我在您发布的代码中找不到任何适合该描述的位置,这就是为什么我怀疑在代码的较早位置存在问题。

我没有回答原始问题。

我到处搜索,这是关于错误的唯一问题。

如果有人遇到了此错误:请勿调用模拟方法来为匹配者提供值。呼叫deviceBuilder.build应在verify(之前进行。

相关内容

  • 没有找到相关文章