java - jMockit - 如何使构造函数调用返回模拟

标签 java mocking testng jmockit

我们目前正在使用 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 方式。预先感谢您的支持。

最佳答案

使用 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);
    }
}

关于java - jMockit - 如何使构造函数调用返回模拟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28980045/

相关文章:

java - 如何在 DROPBOX 中使用 MULTIPART 文件上传来上传文件

java - 将模拟添加到集合适用于 .times,而不适用于 for 循环

unit-testing - 在 InMemoryDatabase 中模拟 EF 核心计算字段以进行单元测试

TestNG:@Test 在类级别执行所有方法

java - JAX-RS 资源作为 POJO 与 CDI 与 EJB

java - setFont() 导致 JFrame 加载延迟

java - 在Java中输入数组最有效的方法是什么?

java - 对象数组的 Easymock 匹配器

java - driver.close 在 testng 中不起作用

java - Spring @Value 读取的继承属性为 null