【问题标题】:Need to mock creation of a object inside a constructor of the class to be tested需要在要测试的类的构造函数中模拟对象的创建
【发布时间】:2014-03-06 06:11:31
【问题描述】:

我正在尝试测试一个在构造函数中创建新对象的类。我正在使用 PowerMock 和 Mockito。

public ClassNeedToTest() throws Exception {

    String targetCategory = "somevalue";
    String targetService = "somevalue";
    invoker = new ServiceInvoker(targetCategory, targetService); // throws Exception
}

对于上面给出的代码,我正在尝试创建一个ClassNeedToTest 的实例来测试该类的不同方法。我无法创建对象,因为ServiceInvoker 创建正在引发异常。 ServiceInvoker 类是第三方类。 有什么方法可以模拟 ServiceInvoker,这样当测试类尝试创建 ClassNeedToTest 时,我可以获得 ServiceInvoker 的模拟对象,而不是真正调用 ServiceInvoker 的构造函数。

在我的测试类中,我只是创建了一个新的 ClassNeedToTest 实例:

ClassNeedToTest obj = new ClassNeedToTest();

【问题讨论】:

    标签: junit mocking mockito powermock


    【解决方案1】:

    我找到了相同的答案。 如果你正确地按照下面给出的步骤,你可以模拟对象。

    第 1 步。 - 添加注释以准备测试类。

    @PrepareForTest({ ServiceInvoker.class, ClassNeedToTest.class})
    

    第 2 步。 - 模拟课堂。

    serviceInvokerMck = Mockito.mock(ServiceInvoker.class);
    

    第 3 步。 调用 new 运算符时使用以下方法模拟对象

    PowerMockito.whenNew(ServiceInvoker.class).withAnyArguments().thenReturn(serviceInvokerMck);
    

    我没有做的是在 PrepareForTest 注释中添加类 ClassNeedToTest 认为应该在那里添加唯一需要模拟的类。

    【讨论】:

    • PowerMockito 没有覆盖。
    • @Varun 这条线是做什么的? @PrepareForTest({ ServiceInvoker.class, ClassNeedToTest.class}) 你能解释一下吗?
    【解决方案2】:

    在类的构造函数中创建对象是不好的做法(依赖倒置原则)。测试此类代码的常用方法是添加一个新的包私有构造函数。

    public ClassNeedToTest() throws Exception {
      this(new ServiceInvoker("somevalue", "somevalue"));
    }
    
    ClassNeedToTest(ServiceInvoker invoker) throws Exception {
      this.invoker = invoker;
    }
    

    您的测试可以使用带有 ServiceInvoker 模拟的新构造函数。之后,您可以公开新的构造函数并将代码重构为仅使用新的构造函数。

    【讨论】:

    • 代码不是我写的。我无法更改 ClassNeedToTest 代码。
    • 如果你不能改变你正在测试的类,那么如果你的测试发现了一个错误,你会怎么做?
    • 我将向团队报告相同的情况,但目前我无法修改现有代码。我知道这是不好的做法,但仍然无法更改代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-11
    • 1970-01-01
    相关资源
    最近更新 更多