当前位置: 首页 > 知识库问答 >
问题:

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

喻珂
2023-03-14

我们目前使用Mockito+PowerMock作为我们的主要模仿框架,并且在开始将一些代码转移到Java8时遇到了一些问题。因此,我们决定将jMockit作为一种替代方案进行评估。我对嘲笑概念有相当好的理解,但我承认我对jMockit的经验非常有限。

然而,我在测试一些在我看来应该是非常基本的东西时遇到了问题:被测试的类在其构造函数中使用New创建其他类的实例。我想让这个新调用返回一个模拟实例。

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

共有1个答案

缪坚诚
2023-03-14

使用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);
    }
}
 类似资料:
  • 问题内容: 我想模拟默认构造函数,以便它不构造表示其创建时间的对象,而始终构造相同的对象(在我的示例中,2010年12月31日以下)。我尝试使用和进行此操作,但是在执行下面的测试时,输出始终为。那么我的嘲笑怎么了? 问题答案: al nik的回答对我来说是一个很好的暗示。最好模拟类而不是类以产生假时间。最后,我自己的解决方案只是模拟该方法(此方法在内部被调用)。 JMockit 1.5及更高版本

  • 问题内容: 我正在尝试第一次使用PowerMockito模拟类构造函数,但是它不起作用。我当前的代码是: 测试失败,因为返回的值为“ Fail”。我的问题在哪里? 问题答案: Okey,找到答案了,您需要致电 代替

  • 问题内容: 这个问题已经在这里有了答案 : java“ void”和“ non void”构造函数 (4个答案) 10个月前关闭。 问题答案: 您定义的实际上不是构造函数,而是称为的方法。如果您将代码更改为如下所示,则可以正常运行: 如果未明确定义任何特定的构造函数,则编译器会自动创建一个无参数的构造函数。

  • 问题内容: 如果我在构造函数中返回一些值或对象,那么var会得到什么? 在两种情况下都会得到什么n? 其实这是一个测验问题,答案是什么? 自定义对象构造函数返回什么? a)新实例化的对象 b)未定义-构造函数不返回值 c)不论return语句是 d)等于return语句是什么;新实例化的对象(如果没有return语句) 问题答案: 我发现了这个很棒的链接: 上面提到的第二点魔术是构造函数返回特定的

  • 问题内容: 我有这个代码。对象构造函数是否有可能以某种方式失败,从而为它分配了一个值,并在构造函数返回后释放了该对象? 问题答案: 假设您使用的是PHP 5,则可以在构造函数中引发异常: 为了清楚起见,您可以将其包装在静态工厂方法中: 顺便说一句,某些版本的PHP 4允许您在构造函数中将$ this设置为NULL,但我认为这从未得到正式批准,并且最终删除了“功能”。

  • 我找到了一些很好的SO链接(如何从异步回调函数返回值?以及从node.js中的回调函数返回值等),但它们并不是不能为我的问题提供解决方案。 我的问题:能够得到异步调用的结果,但我如何使用这个结果返回我的函数? 这里获取callBackResponse的值为true或false,并希望将该值用作: