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

时间:2015-03-11 06:32:51

标签: 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方式。提前感谢您的支持。

1 个答案:

答案 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);
    }
}