Unit testing 还有一个单元测试问题

Unit testing 还有一个单元测试问题,unit-testing,mocking,mockito,private,powermock,Unit Testing,Mocking,Mockito,Private,Powermock,我想对一个依赖性大约为10亿的类进行单元测试。在这个特定的例子中,我想测试一个有点像这样的方法: class Suicide { IrrelevantObject n; ObjectsThatGetInitializedWhoTheFKnowsWhere m; private String privateFunc() { //... tons of things with dependencies // I am not testing this in th

我想对一个依赖性大约为10亿的类进行单元测试。在这个特定的例子中,我想测试一个有点像这样的方法:

class Suicide
{
  IrrelevantObject n;
  ObjectsThatGetInitializedWhoTheFKnowsWhere m;

  private String privateFunc()
  {
     //... tons of things with dependencies
     // I am not testing this in this test.. or should I?
  } 

  public String testFunc()
  {
     String x = "";
     String y = privateFunc();
     if(n.anotherPrivateFunc(y) == 5) 
           x = "yolo";
     return x;
  } 
}
好的,问题是:
我已经读到,您不应该模拟私有方法,但在这种情况下,由于它们无休止的依赖关系,我非常希望对它们进行存根,以便测试该方法是否有效。如果我应该在私有方法中存根信息,我也可以看出这有什么意义,但我只是不知道如何使用Mockito或任何其他框架来实现这一点。非常感谢您的帮助。

您可以简化这些依赖关系。例如,用接口替换它们

class Suicide
{
  IIrrelevantObject n;
  IObjectsThatGetInitializedWhoTheFKnowsWhere m;
如果这些接口不存在,请创建它们

然后,您只需让测试注入这些接口的模拟。有几种方法可以做到这一点:

  • 添加setter(可能将它们称为
    setForTest
    ,这样,如果prod代码使用它,就会有一种清晰的气味)
  • 使它们
    受保护
    并在测试中继承此类
  • 添加一个可以接受这些接口的构造函数,并在测试中使用这个构造函数
现在,您遇到的是一个具有大量依赖项的类,但是您可以轻松地模拟依赖项。所以你不需要再特别地嘲笑私人


另一方面,您可能需要考虑端到端测试。ie:调用
main
,让代码像在prod中一样运行(可能在沙箱中)

  • 优点:您不必再担心依赖性/私有性,因为您处于更高的级别
  • 缺点:根据您的基础结构,实施此类测试可能并不总是简单的。(这些测试通常比单元测试慢)

无论如何,这两种方法并不是不兼容的

欢迎使用堆栈溢出!你应该试着给你的问题一个有意义的标题,这样其他用户就可以看到他们对你的问题的期望。