3

モックを使用して簡単なテストを実行しようとすると、予期しないエラーが発生します。

@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(File root)です。デバイスには、JoshBlochに従って明確に定義された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がクラスを管理する方法からの奇妙さ、またはバージョンの非互換性のいずれかですが、それが私には見えない明らかなものであることを願っています。

4

3 に答える 3

2

私はこれが古い質問であることを知っていますが、これは他の誰かに役立つかもしれません。

質問に記載されている問題の詳細については、http://code.google.com/p/mockito/issues/detail ?id=303をご覧ください。

まったく同じ問題が発生し、 https://github.com/cyrusinnovation/mockito-groovy-supportで提供されているライブラリを使用して修正しました。

于 2013-07-13T22:02:19.257 に答える
0

Mockitoは、発生時ではなく次の呼び出し時に不適切な使用にフラグを立てない場合があります。あなたはその前のテストを見ることができます、多分あなたはそこで問題を抱えていますか?

メッセージは、呼び出しでマッチャーのみまたは実際のオブジェクトのみを提供する必要があり、それらの組み合わせは提供しないことを示しています。通常、オブジェクト自体(またはsameInstance(obj))の代わりにeq(obj)を使用してこれを修正し、すべてのマッチャーを作成できます。ただし、この場合、投稿したコードにその説明に一致する場所が見つからないため、コードの以前の場所に問題があると思われます。

于 2013-04-21T05:52:29.117 に答える
-1

私は元の質問に答えていません。

私は至る所で検索しました、そして、私が得たエラーについての唯一の質問はこの議論へのポイントです。

誰かがこのエラーを受け取った場合:マッチャーに値を提供するためにモックメソッドを呼び出さないでください。呼び出しdeviceBuilder.buildは前に行く必要がありverify(ます。

于 2015-06-17T16:31:08.687 に答える