23

次の単体テストを実行すると、例外がスローされます。java.lang.IllegalStateException:利用可能なモックでの最後の呼び出しはありません


import org.easymock.*;
import org.junit.*;

public class MyTest {

    @Test
    public void testWithClass() {
        Thread threadMock = EasyMock.createMock(Thread.class);
        EasyMock.expect(threadMock.isAlive()).andReturn(true);
    }
}

何が間違っているのかわからず、ウェブ上で良い例を見つけることができません。EasyMock3.0を使用してクラスをどのようにモックしますか。上記の単体テストの何が問題になっていますか?どんな助けでも大歓迎です。

私のプロジェクトには、次のMaven依存関係が含まれています

<dependency>
   <groupId>org.easymock</groupId>
   <artifactId>easymock</artifactId>
   <version>3.0</version>
   <scope>test</scope>
</dependency>
<dependency>
   <groupId>cglib</groupId>
   <artifactId>cglib-nodep</artifactId>
   <version>2.2</version>
   <scope>test</scope>
</dependency>
<dependency>
   <groupId>org.objenesis</groupId>
   <artifactId>objenesis</artifactId>
   <version>1.2</version>
   <scope>test</scope>
</dependency>
4

3 に答える 3

19

この例外の理由は、それThread#isAlive()finalメソッドであることですが、EasyMock は final メソッドのモックをサポートしていません。したがって、内部にあるこのメソッドの呼び出しEasyMock.expect(...)は、「モックの呼び出し」とは見なされません。

final メソッドをモックするには、JMockit (私が開発) などの別のモック ツールが必要になります。

public void testMockingFinalMethod(@Mocked("isAlive") Thread mock)
{
    new Expectations()
    {{
        mock.isAlive(); result = true;
    }};

    assertTrue(mock.isAlive());
}

一般に、モック API では、モックするメソッドを明示的に指定する必要はありません。Thread授業は難しいですけどね。

于 2011-02-15T11:57:23.013 に答える
11

作成したモック オブジェクトを準備していないことを除けば、テスト メソッドは問題ないように見えます。これは使用して行う必要があります

EasyMock.replay(mockObject1, mockObject2, ...);

これにより、JUnit の実行時に使用されるモック オブジェクトが準備されます。依存関係にも問題はありません。

また、ここで単体テストを行っている実際のメソッドを呼び出していないようです。通常、テスト メソッドを作成する方法は、テスト メソッドのコンテキストを超えた外部オブジェクトがある場合にのみモック ライブラリ (EasyMock や PowerMock など) を使用して JUnit メソッドを作成し、モックされたすべてのオブジェクトを再生することです (これにより、テストで実際のビジネス オブジェクトを置き換えるためのモック)。その後、テストしようとしている実際のメソッドを呼び出し、メソッドを使用して機能を検証しorg.junit.Assert.assertXXX()ます。

于 2010-09-02T15:28:13.797 に答える