0

次のコードがあります。

PowerMockito.mockStatic(DateUtils.class);      
//And this is the line which does the exception - notice it's a static function  
PowerMockito.when(DateUtils.isEqualByDateTime (any(Date.class),any(Date.class)).thenReturn(false);

クラスは次のように始まります。
@RunWith(PowerMockRunner.class) @PrepareForTest({CM9DateUtils.class,DateUtils.class})

そして、私はorg.Mockito.exceptions.InvalidUseOfMatchersException を取得します......検証またはスタブの外で引数マッチャーを使用することはできません..... (エラーは失敗トレースに 2 回表示されますが、両方とも同じ行を指しています)

私のコードの他の場所では、whenの使用が完了し、適切に機能しています。また、コードをデバッグすると、any(Date.class) が null を返すことがわかりました。

私は他の人が有用だと思った次の解決策を試しましたが、私にとってはうまくいきません:

  1. @After public void checkMockito() { Mockito.validateMockitoUsage(); }
    またはまたは追加
    @RunWith(MockitoJUnitRunner.class)

    @RunWith(PowerMockRunner.class)

  2. への変更 PowerMockito.when(new Boolean(DateUtils.isEqualByDateTime(any(Date.class), any(Date.class)))).thenReturn(false);

  3. 使用anyObject()(コンパイルされません)

  4. またはを使用して notNull(Date.class) (Date)notNull()

  5. 交換 when(........).thenReturn(false);


    Boolean falseBool=new Boolean(false);
    _
    when(.......).thenReturn(falseBool);

4

3 に答える 3

0

結局、私にとってうまくいったのは、例外を実行する行を他の静的関数にエクスポートすることでした。私はそれをcompareDatesと呼びました。

私の実装:

テストされるクラス (例 - MyClass )
static boolean compareDates(Date date1, Date date2) { return DateUtils.isEqualByDateTime (date1, date2); }

そしてテストクラスで:
PowerMockito.mockStatic(MyClass.class); PowerMockito.when(MyClass.compareDates(any(Date.class), any(Date.class))).thenReturn(false);

残念ながら、このソリューションが機能し、前のソリューションが機能しなかった理由を完全に理解しているとは言えません。
おそらく、DateUtilsクラスが私のコードではなく、そのソースにアクセスできず、生成された.classファイルにしかアクセスできないという事実に関係しているのかもしれませんが、それについてはよくわかりません。


編集

DateUtils 上記の解決策は、コードでisEqualByDateTime呼び出しをカバーする必要性を解決していない単なる回避策でした 。実際
の問題 を実際に解決したのは、実際の実装を持つクラスをインポートすることであり、それを拡張するだけのクラスではなく、以前にインポートしたものです。 DateUtils

これを行った後、元の行を使用できました

PowerMockito.mockStatic(DateUtils.class);      

PowerMockito.when(DateUtils.isEqualByDateTime (any(Date.class),any(Date.class)).thenReturn(false);

例外なく。

于 2015-07-02T11:42:32.673 に答える
0

Kotlin Test Class のTextUtilsで同様の問題が発生し ました

PowerMockito.`when`(TextUtils.isEmpty(Mockito.anyString())).thenReturn(true)

テストクラスの上に以下のコードを追加して解決しました

 @PrepareForTest(TextUtils::class)

そして、 PowerMockito.`when` の前にmockStatic this を呼び出しました。

PowerMockito.mockStatic(TextUtils::class.java)
于 2021-09-07T14:22:21.417 に答える