2010-08-16 30 views
19

运行下面的单元测试没有最后调用抛出异常:java.lang.IllegalStateException:在模拟可用EasyMock的3.0,嘲讽类引发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); 
    } 
} 
没有最后一次通话

我不知道我在做什么错,在网上找不到任何好的例子。你如何使用EasyMock 3.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> 

回答

10

你的测试方法看起来不错,但你有没有准备已创建的模拟对象。这必须使用

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

这将准备嘲笑的对象,以便它将用于运行您的JUnit。您的依赖关系也没有问题。

此外,您似乎没有调用实际方法,您在此处进行单元测试。通常,编写测试方法的方法是编写JUnit方法,仅在测试方法上下文之外存在外部对象时使用模拟库(例如EasyMock和PowerMock),然后重播所有模拟对象(准备好嘲笑在测试中替代真正的业务对象)。之后,您可以调用您尝试测试的实际方法,并使用org.junit.Assert.assertXXX()方法验证功能。

17

此例外的原因是Thread#isAlive()final方法,但EasyMock不支持最终方法的模拟。所以,出现在EasyMock.expect(...)内的这种方法的调用并不被视为“模拟调用”。

嘲笑最后的方法,您将需要一个不同的嘲弄工具,如JMockit(我开发):

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

    assertTrue(mock.isAlive()); 
} 

嘲讽API实际上并不需要被嘲笑被明确指定,在方法一般情况。虽然,Thread类是一个棘手的问题。