运行以下单元测试会抛出异常: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);
}
}
Run Code Online (Sandbox Code Playgroud)
我不确定我做错了什么,在网上找不到任何好的例子.你如何使用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>
Run Code Online (Sandbox Code Playgroud)
Rog*_*rio 19
此异常的原因是这Thread#isAlive()是一种final方法,但EasyMock不支持模拟最终方法.因此,内部出现的对此方法的调用EasyMock.expect(...)不会被视为"模拟调用".
要模拟最终方法,您需要一个不同的模拟工具,例如JMockit(我开发):
public void testMockingFinalMethod(@Mocked("isAlive") Thread mock)
{
new Expectations()
{{
mock.isAlive(); result = true;
}};
assertTrue(mock.isAlive());
}
Run Code Online (Sandbox Code Playgroud)
在一般情况下,模拟API实际上并不要求显式指定要模拟的方法.不过,这Thread堂课很棘手.
Nag*_*U M 11
您的测试方法看起来很好,除了您没有准备好您创建的模拟对象.这必须使用
EasyMock.replay(mockObject1, mockObject2, ...);
Run Code Online (Sandbox Code Playgroud)
这将准备模拟对象,以便它将用于运行JUnit.您的依赖项也没有问题.
此外,您似乎没有调用您在此处进行单元测试的实际方法.通常,编写测试方法的方法是编写一个JUnit方法,只有在测试方法上下文之外有外部对象时才使用模拟库(如EasyMock和PowerMock),然后重放所有模拟对象(准备模拟替换测试中的真实业务对象).之后,您调用要测试的实际方法,并使用org.junit.Assert.assertXXX()方法验证功能.
| 归档时间: |
|
| 查看次数: |
49578 次 |
| 最近记录: |