2013-11-21 15 views
8

私は単純なテストケースを実行しようとしています。私は次の方法を持っています。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の上の他の記事をいくつか読んでますが、その解決策は、彼らがMockitoとPowerMockを使用していたということのようでした。私は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) 
. 
. 
. 

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

+0

あなたはMavenを使用していますか? –

+0

いいえ、私は現在Mavenを使用していません。 –

+0

@RenéLinkJavaAssistでこの問題を修正しました。私はちょうどプロジェクトに図書館を持っていなかったことが分かります。だから今は大丈夫です。しかし、私は今、この偽の問題を抱えています。 –

答えて

16

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

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

    @Test 
    public void testRun(){ 

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

Use the @PrepareForTest(ClassThatContainsStaticMethod.class) annotation at the class-level of the test case.

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

javassistライブラリがありません。クラスパスに入れてください。たぶんいくつかの他のライブラリも欠けているかもしれません...我々は見るでしょう。

あなたは

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

を取得した場合、あなたはEasyMock.replay()を使用しているが、あなたはPowerMock.replay()

+0

オハイオ州を更新しました。 @PrepareForTestを試してみましたが、メソッドレベルで行っていました。 @PrepareForTest(CommandLineOptionProcessor.class)と@RunWith(PowerMockRunner.class)をクラスレベルに設定すると、新しいエラーが発生するようになりました。元の投稿を編集します。 –

+1

ええ、私はちょうど同様にそれを発見した。私はもう一度私のテストに変更を加えなければなりませんでした(しかし、それは私のテストが失敗しただけでした)。今は素晴らしい作品です。 Powermockを使って静的メソッドをMockingすることのすべての助けとウォークスルーに感謝します。 Def。あなたがそれを初めて使った時に少し混乱します。 –

0
EasyMock.expectLastCall() 

または

EasyMock.expectLastCall().anyTimes() 

または

EasyMock.expectLastCall().andAnswer(..) 
0を使用する必要があります。

がコードに存在しません。テストするメソッドの後にある必要があります。 テストメソッドがvoidメソッドである場合です。

そうでなければ、使用することができます。

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

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

@ObjectFactory 
public IObjectFactory getObjectFactory() { 

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

テストクラスに追加するものは何ですか? –

+1

私は問題がありました - 静的なクラスをモックしようとすると例外があり、これが私を助けました。 –

関連する問題