java - Jmockit:如何验证在特定实例上调用了方法

标签 java unit-testing jmockit

我在 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()

  1. 创建ExampleClass的新实例
  2. 在该实例上调用 doSomething
  3. 创建ExampleClass的另一个实例
  4. 在第二个实例上调用 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/

相关文章:

java - Reactor 取消订阅的方式

java - Mybatis插入参数类型转换错误

unit-testing - 如何模拟 angularjs 应用程序的后端?

Python unittest 测试用例捕获错误失败

java - 可以在 JMockit 中模拟用 @Context 注释的字段吗?

java - 如何使用 JMockit 模拟 FacesContext,所有测试都因 NullPointerException 而失败

java - maven型材还是 Spring 型材?

java - Joda Time 操纵

python - 从 UnitTest/WebTest 运行 Python/Django 管理命令

java - JMockit,如何模拟没有返回的私有(private)方法