我在 Java 1.7 上使用 JMockit 1.15。
我想验证一些经过测试的代码是否首先创建特定类 (ExampleClass) 的新实例,然后在该实例上调用方法。 我尝试了很多方法,以多种不同的方式使用验证、期望、@Mocked、@Injectable,但我无法成功。
下面是一个示例。
ExampleClass 是一个类;我将模拟它,并想验证它是如何使用的。
public class ExampleClass {
final double id = Math.random();
public ExampleClass() {
}
public void doSomething() {
System.out.println("I did something - " + id);
}
}
ExampleClassUser 包含我要测试的逻辑。
请注意,wrongUsage() 构建了两个 ExampleClass 实例,但始终对第一个实例调用 doSomething()。
public class ExampleClassUser {
public void rightUsage() {
final ExampleClass exampleClass1 = new ExampleClass();
exampleClass1.doSomething();
final ExampleClass exampleClass2 = new ExampleClass();
exampleClass2.doSomething();
}
public void wrongUsage() {
final ExampleClass exampleClass1 = new ExampleClass();
exampleClass1.doSomething();
final ExampleClass exampleClass2 = new ExampleClass();
exampleClass1.doSomething();
}
}
ExampleClassUserTest 是我想要构建的测试。 它应该检查每个方法调用rightUsage()或wrongUsage()
- 创建ExampleClass的新实例
- 在该实例上调用 doSomething
- 创建ExampleClass的另一个实例
- 在第二个实例上调用 doSomething
应用到 rightUsage() 时测试应该成功,应用到rongUsage() 时测试应该失败。
当然,我的测试无法做到这一点,因为它只是检查是否正在创建新实例以及是否执行了两个方法调用,但**不检查执行了哪个实例调用方法” .
import mockit.FullVerificationsInOrder;
import mockit.Mocked;
import org.junit.Test;
import org.junit.runner.RunWith;
@RunWith(mockit.integration.junit4.JMockit.class)
public class ExampleClassUserTest {
@Test
public void testUsage(final @Mocked ExampleClass exampleClass) {
//new ExampleClassUser().rightUsage();
new ExampleClassUser().wrongUsage();
new FullVerificationsInOrder() {{
new ExampleClass();
exampleClass.doSomething();
new ExampleClass();
exampleClass.doSomething();
}};
}
}
最佳答案
使用 JMockit 1.17 或更高版本,以下版本的测试将起作用(即,它将按预期失败):
@Test
public void testUsage(@Mocked ExampleClass exampleClass)
{
new ExampleClassUser().wrongUsage();
new FullVerificationsInOrder() {{
ExampleClass e1 = new ExampleClass(); // matches first new instance
e1.doSomething(); // matches only on instances equivalent to "e1"
// Same as before, now for the second instance.
ExampleClass e2 = new ExampleClass();
e2.doSomething(); // fails with a "missing invocation"
}};
}
关于java - Jmockit:如何验证在特定实例上调用了方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29694054/