【发布时间】:2015-04-17 08:27:50
【问题描述】:
我在 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() 测试应该成功,应用到 wrongUsage() 测试应该失败。
当然,我的测试无法做到这一点,因为它只是检查是否正在创建新实例以及是否执行了两个方法调用,但**不检查在哪个实例上执行了方法调用” .
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写,但是看起来不太好。我认为你应该描述你需要解决的实际测试问题,而不是展示一个人为的例子。我敢打赌,真正的问题会更容易。
-
好吧,我试图通过一个特别的例子使它更清晰和可执行,但是,正如你问我的那样,我会报告真实的情况。
-
我有一个代表 ssh 调用的类(使用构造函数
SshCommand(String command, Host targetHost))并有一个execute()方法。在整个测试代码中使用了这个类的许多实例。我希望我的单元测试检查创建了哪些实例以及在哪些实例上使用了execute()方法。 -
我在下面看到了您的示例解决方案,这正是我的想法(我只需要等待新版本发布)。你为什么说“它看起来不好看”?
-
在 JMockit 1.16 或更早版本上看起来不太好,因为测试必须使用带有
Invocation参数的Delegate对象,以便它可以访问新实例和将其保存到测试类中的一个字段中。 JMockit 1.17+ 在将方法期望与先前匹配的构造函数期望匹配时使用内部“等效实例”映射,因此测试变得更加简单。
标签: java unit-testing jmockit