1. ホーム
  2. java

[解決済み] Powermock (With Easymock) モックの最後の呼び出しはありません。

2022-02-03 02:01:56

質問

簡単なテストケースを実行しようとしているだけです。 次のメソッドがあります。

public static void run(String[] args) throws Throwable {
    CommandLineArguments opts = CommandLineOptionProcessor.getOpts(args);
}

このメソッド/テストケースは、今後も順次構築していく予定です。 しかし、まずは簡単なテストケースが動作することを確認したいと思います。 そこで、次のようなテストを書いてみました。

@Test
public void testRun() {
    String[] args = {"--arg1", "value", "--arg2", "value2"};

    mockStatic(CommandLineOptionProcessor.class);
    expect(CommandLineOptionProcessor.getOpts(args));

    EasyMock.replay(CommandLineOptionProcessor.class);
}

その後、次のようなエラーが発生します。

java.lang.IllegalStateException: no last call on a mock available

StackOverflowの他の投稿をいくつか読みましたが、彼らの解決策はPowerMockをMockitoで使っているということのようでした。 私はPowermockとEasymockを使用しているので、問題ないはずです。

Reneのアドバイスに従って、クラスのトップに以下を追加しました。

@PrepareForTest(CommandLineOptionProcessor.class)
@RunWith(PowerMockRunner.class)
public class DataAssemblerTest {

前のエラーは直しました。 しかし、今度はこのエラーが発生しました。

java.lang.IllegalArgumentException: Not a mock: java.lang.Class
at org.easymock.internal.ClassExtensionHelper.getControl(ClassExtensionHelper.java:61)
at org.easymock.EasyMock.getControl(EasyMock.java:2172)
at org.easymock.EasyMock.replay(EasyMock.java:2074)
.
.
.

何が原因なのか、何かアイデアがあれば教えてください。

解決方法は?

テストクラスのアノテーションは @RunWith(PowerMockRunner.class)@PrepareForTest(CommandLineOptionProcessor.class) ?

 @RunWith(PowerMockRunner.class)
 @PrepareForTest(CommandLineOptionProcessor.class)
 public class TestClass {

     @Test
     public void testRun(){

が必要です。 @PrepareForTest(CommandLineOptionProcessor.class) をテストクラスレベルで使用します。を参照してください。 Powermock ドキュメント :

テストケースのクラスレベルで @PrepareForTest(ClassThatContainsStaticMethod.class) アノテーションを使用します。

また、必要なライブラリがテストのクラスパスにあることを確認してください。

あなたの場合 javassist ライブラリがありません。クラスパスに追加してください。もしかしたら他のライブラリも足りないかもしれませんが...それはまた今度。

もし

java.lang.IllegalArgumentException: Not a mock: java.lang.Class

を使用している場合は EasyMock.replay() を使用する必要があります。 PowerMock.replay()