web-dev-qa-db-ja.com

Powermock(Easymockを使用)、モックでの最後の呼び出しはありません

単純なテストケースを実行しようとしています。以下の方法があります。

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を使用しているので、問題はありません。

私はルネのアドバイスに従い、クラスのトップに以下を追加しました。

@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)
.
.
.

これを引き起こしている可能性のあるものについてのアイデアは素晴らしいでしょう。

12
Cameron Jones

テストクラスに@RunWith(PowerMockRunner.class)および@PrepareForTest(CommandLineOptionProcessor.class)の注釈を付けましたか?

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

     @Test
     public void testRun(){
_

テストクラスレベルで@PrepareForTest(CommandLineOptionProcessor.class)が必要です。 Powermock doc を参照してください:

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

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

あなたの場合 javassist ライブラリがありません。クラスパスに配置します。たぶん他のいくつかのライブラリーも欠落しています...

あなたが取得する場合

_Java.lang.IllegalArgumentException: Not a mock: Java.lang.Class
_

次にEasyMock.replay()を使用していますが、PowerMock.replay()を使用する必要があります

19
René Link
 EasyMock.expectLastCall() 

または

 EasyMock.expectLastCall().anyTimes() 

または

 EasyMock.expectLastCall().andAnswer(..)

あなたのコードには存在しません、あなたのテストメソッドがvoidメソッドである場合、これはテストしたいメソッドの後になければなりません。

それ以外の場合は使用できます:

expect(CommandLineOptionProcessor.getOpts(args)).andReturn(object);

また、これをあなたのテストクラスに追加してください:

  @ObjectFactory
public IObjectFactory getObjectFactory() {

    return new org.powermock.modules.testng.PowerMockObjectFactory( );
}
0
Radu Toader