另一个单元测试问题

时间:2014-07-09 18:53:38

标签: unit-testing mocking mockito private powermock

我想对一个具有大约十亿个依赖项的类进行单元测试。在这种特定情况下,我想测试一个看起来有点像这样的方法:

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;
  } 
}

好的,这就是问题所在: 我已经读过你不应该模拟PRIVATE方法,但在这种情况下,由于它们无休止的依赖关系,我迫切希望将它们存根,以便我可以测试该方法的工作原理。如果我应该在私有方法中存根信息,我可以看到它是如何有意义的,但我不知道如何使用Mockito或任何其他框架来做到这一点。非常感谢你的帮助。

1 个答案:

答案 0 :(得分:0)

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

class Suicide
{
  IIrrelevantObject n;
  IObjectsThatGetInitializedWhoTheFKnowsWhere m;

如果这些接口不存在,请创建它们!

然后你必须让你的测试注入这些接口的模拟。有几种方法可以做到这一点:

  • 添加setter(可能会将它们称为setForTest,这样如果prod代码使用它就会有一种清晰的气味)
  • 让他们protected并在测试中继承此类
  • 添加一个可以接受这些接口的构造函数,并在测试中使用这个接口

现在,您遇到了一个具有大量依赖关系的类,但您可以轻松地模拟依赖关系。所以你不再特别需要嘲笑私人了。


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

  • 优势:您不必担心依赖/私有,因为您处于更高层次
  • 缺点:根据您的基础设施,进行此类测试可能并不总是很简单。 (这些测试通常比单元测试慢)

无论如何,两种方法都不相容