【问题标题】:Mocking methods from different class than tested one来自不同类的模拟方法,而不是经过测试的方法
【发布时间】:2017-07-06 10:38:46
【问题描述】:

我在为我的一种方法编写单元测试时遇到问题。它从不同的类调用一个方法,更糟糕的是,它会根据服务器连接进行一些处理,所以我需要以某种方式模拟它,但是我找不到如何做到这一点的答案。我还想指出,经过测试的方法不会将这个不同的类对象作为参数,而是在自身内部实例化它,所以它看起来像这样:

public class Class1 {
    public MyEnum method1(String myString){
        Class2 class2 = new Class2();
        return class2.method2(myString);
    }
}
public class Class2 {
    public MyEnum method2(String myString){
       //returns some value after communication with a server
    }
}

所以基本上我需要模拟 method2 返回值,但是因为它的类是在 method1 内部实例化的,所以我看不到这样做的方法。有没有什么方法可以在没有实际服务器连接的情况下进行测试?

【问题讨论】:

  • Mockito 不支持你想要的(模拟 Class2),至少目前不支持(可能在未来的版本中)。您需要使用支持模拟“未来对象”的模拟库,例如 PowerMock。
  • PowerMock 确实做到了,谢谢。

标签: java unit-testing mocking mockito testng


【解决方案1】:

根据经验,你的单元测试应该只测试一个类,其他的都应该被模拟。
作为良好设计的规则,所有依赖项都应该是可注入的,即您的 Class2 不应该在 Class1 内实例化(绝对不能在此类的方法内,因为每次调用该方法时它都会创建一个新实例)。
如果上述任何一条规则被打破,您应该考虑重写代码。

【讨论】:

  • 不幸的是,我正在测试遗留代码,除非它实际上不起作用,否则我不允许更改它......所以如果这完全可以测试,那么我需要找到一种方法来做到这一点重构。那么有没有可行的方法来解决这个问题呢?
  • 恐怕在这种情况下你无能为力。
  • 没有这样的“良好设计规则”表明依赖关系应该被注入而不是直接实例化。相反,为了支持 DI 友好的非 OO 无状态“服务”,通常故意避免应该使用客户端状态实例化的有状态依赖项。我在真实代码中看到过很多这样的 DI 误用。
猜你喜欢
  • 2018-07-17
  • 1970-01-01
  • 2016-07-17
  • 1970-01-01
  • 1970-01-01
  • 2021-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多