我们目前正在使用Mockito + PowerMock作为我们的主要模拟框架,并且一旦开始将我们的一些代码移动到java 8,就遇到了一些问题。 因此我们决定评估jMockit作为替代方案。我对嘲笑概念有很好的理解,但我承认我对jMockit的经验非常有限。
但是我在测试某些东西时遇到了问题,在我看来这应该是非常基础的:测试中的类使用new在其构造函数内创建一个其他类的实例。那个新的调用是我想要返回一个模拟实例的东西。
以下是我正在使用的代码: 包com.some.org.some.app;
import mockit.Expectations;
import mockit.Injectable;
import mockit.Mocked;
import org.testng.annotations.Test;
public class ClassUnderTestTest {
interface SomeService {
void doWork();
}
class ClassUnderTest {
private final SomeService service;
public ClassUnderTest() {
this.service = new SomeService() {
@Override
public void doWork() {
}
};
}
}
@Injectable
private SomeService mockService;
@Test
public void shouldBeAbleToMaskVariousNumbers() throws Exception {
new Expectations() {{
new ClassUnderTest();
result = mockService;
}};
}
}
运行上述内容时,我收到以下异常:
java.lang.IllegalStateException: Missing invocation to mocked type at this point;
please make sure such invocations appear only after the declaration of a suitable
mock field or parameter
我使用TestNG作为测试框架,实际上我的测试方法有一堆参数,因为它期望一些测试数据由数据提供者传递。
这是非常基本的,看起来我的方法不是jMockit方式。提前感谢您的支持。
答案 0 :(得分:3)
使用JMockit非常容易:
public class ClassUnderTestTest {
interface SomeService { int doWork(); }
class ClassUnderTest {
private final SomeService service;
ClassUnderTest() {
service = new SomeService() {
@Override public int doWork() { return -1; }
};
}
int useTheService() { return service.doWork(); }
}
// This annotation is a variation on @Mocked, which extends
// mocking to any implementation classes or subclasses of
// the mocked base type.
@Capturing SomeService mockService;
@Test
public void shouldBeAbleToMaskVariousNumbers() {
new Expectations() {{ mockService.doWork(); result = 123; }};
int n = new ClassUnderTest().useTheService();
assertEquals(123, n);
}
}