6

この静的メソッドをテストしているとき

public class SomeClass {
    public static long someMethod(Map map, String string, Long l, Log log) {
        ...
    }
}

import org.apache.commons.logging.Log;

@RunWith(PowerMockRunner.class)
//@PrepareForTest(SomeClass.class)
public class Tests {
    @Test
    public void test() {
        ...
        PowerMockito.mockStatic(SomeClass.class);
        Mockito.when(SomeClass.someMethod(anyMap(), anyString(), anyLong(), isA(Log.class))).thenReturn(1L);
        ...
    }
}

私は得InvalidUseOfMatchersExceptionた。私の質問は次のとおりです。

  1. すべての引数がマッチャーを使用しているのに、なぜこの例外が発生したのですか? それを解決する方法は?私はそれをデバッグしました、isA(Log.class)戻り値がnullであることがわかりました。
  2. @PrepareForTest注釈をテスト クラスに追加してテストを実行すると、junit が応答しません。なんで?

編集

引数マッチャーを使用しないようにしましたが、

org.mockito.exceptions.misusing.MissingMethodInvocationException: when() には「モックのメソッド呼び出し」でなければならない引数が必要です。例: when(mock.getArticles()).thenReturn(articles);

また、このエラーは次の理由で表示される場合があります。

  1. final/private/equals()/hashCode() メソッドのいずれかをスタブします。これらのメソッドはスタブ/検証できません。

  2. when() 内では、モックではなく他のオブジェクトでメソッドを呼び出します。

で ...

だからそれsomeMethod自体が原因のようです。メソッドには同期ブロックがあります。Powermockito はそのようなメソッドをモックできるかどうか疑問に思っています。

4

4 に答える 4

2

このような isA() を別の any() 呼び出しに置き換えてみてください

Mockito.when(SomeClass.someMethod(anyMap(), anyString(), anyLong(), any(Log.class))).thenReturn(1L);

[編集]

例外が発生したら、スタックトレースを確認してください。NoClassDefFoundError報告はありますか?javassist.jarプロジェクトに を含めていなかったときに、同様のエラーが発生したことに気付きました。

私は PowerMockito を使用しています。これらは、@Tom が投稿したコードを実行するために新しいプロジェクトに追加した jar です。

  • powermock-mockito-1.4.10-full.jar
  • mockito-all-1.8.5.jar
  • javassist-3.15.0-GA.jar
  • junit-4.8.2.jar
  • common-logging-1.1.1.jar

互換性のある JAR バージョンを使用していることを常に確認し、プロジェクトのクラスパスに競合する他の JAR がないかどうかも確認することをお勧めします。

于 2012-05-31T09:10:05.767 に答える
1

以下の行は、決して遅いよりはましです。

Mockito.when(SomeClass.someMethod(anyMap(), anyString(), anyLong(),
    isA(Log.class))).thenReturn(1L);

次のようにする必要があります。

PowerMockito.when(SomeClass.someMethod(anyMap(), anyString(), anyLong(),
    isA(Log.class))).thenReturn(1L);

したがって、 を呼び出す代わりに、 を呼び出すMockito.when必要がありますPowerMockito.when

于 2016-06-09T14:08:23.690 に答える
0
  1. isA は常に を返しnullます。これは仕様によるもので、 isA() メソッドの Javadoc に記載されています。この理由は、null がクラスのパラメーター化された戻り値の型と常に一致し、 isA() マッチャーが使用されるスタブ化されたメソッドの引数の型と常に一致するためです。返される null 値は実際には処理されません。

  2. 私にとってはうまくいくようです。私の完全なテストケース:

import static org.mockito.Matchers.*;

import java.util.Map;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.impl.SimpleLog;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mockito;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;

class SomeClass {
  public static long someMethod(final Map map, final String string, final Long l, final Log log) {
    return 2L;
  }
}

@RunWith(PowerMockRunner.class)
@PrepareForTest(SomeClass.class)
public class InvalidUseOfMatchersTest {
    @Test
    public void test() {
        // Mock the SomeClass' static methods, stub someMethod() to return 1
        PowerMockito.mockStatic(SomeClass.class);
        Mockito.when(SomeClass.someMethod(anyMap(), anyString(), anyLong(), isA(Log.class))).thenReturn(1L);

        // null NOT is-a Log, uses default stubbing: returns 0
        System.out.println(SomeClass.someMethod(null, null, 5L, null));
        // SimpleLog passes is-a test, uses stubbed result: returns 1
        System.out.println(SomeClass.someMethod(null, null, 7L, new SimpleLog("simplelog")));
    }
}

何が起こっているのかを診断するのに役立つ完全な例を投稿してください。

于 2012-05-31T17:47:07.400 に答える
-1
<dependency>
        <groupId>org.mockito</groupId>
        <artifactId>mockito-all</artifactId>
        <version>${mockito.version}</version>
    </dependency>
    <dependency>
        <groupId>org.powermock</groupId>
        <artifactId>powermock-module-junit4</artifactId>
        <version>${powermock.version}</version>
        <type>jar</type>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.powermock</groupId>
        <artifactId>powermock-api-mockito</artifactId>
        <version>${powermock.version}</version>
        <type>jar</type>
        <scope>provided</scope>
    </dependency>

あなたのプロジェクトがmavenを使用していることを願っています。これらの jar をビルドに含めてみてください。

于 2012-06-01T08:43:32.387 に答える