Java 如何子类化父对象以进行模拟

Java 如何子类化父对象以进行模拟,java,unit-testing,design-patterns,mocking,refactoring,Java,Unit Testing,Design Patterns,Mocking,Refactoring,如何使用私有构造函数对父类进行子类化,以便模拟它 我已经重构了我的代码,当它调用第三方库时,调用是 包装,以便我可以模拟类并创建一个假包装。理论上我可以归还我想要的任何东西 使用依赖项注入等测试我的生产代码 对于一些库调用,将返回单个对象实例,该实例本身就是一个特定的库 对象类型。在生产代码中,随后会对该对象进行调用 下面的代码对此进行了说明: public class MyWrapper { public LibraryObject MyWrappedCall() { Libr

如何使用私有构造函数对父类进行子类化,以便模拟它

我已经重构了我的代码,当它调用第三方库时,调用是 包装,以便我可以模拟类并创建一个假包装。理论上我可以归还我想要的任何东西 使用依赖项注入等测试我的生产代码

对于一些库调用,将返回单个对象实例,该实例本身就是一个特定的库 对象类型。在生产代码中,随后会对该对象进行调用

下面的代码对此进行了说明:

public class MyWrapper
{
  public LibraryObject MyWrappedCall()
  {
    LibraryObject x = ExternalLibrary.getLibObject();
    return x;
  }
}

public class MyProductionCode
{
  public void DoX()
  {
    LibraryObject lo = MyWrapper.getX();
    ProductionType pt = lo.doSomething();
  }
}
如何伪造doSomething()方法?我的第一个想法是不返回实例对象 从包装调用中,返回一个相同类型的对象。所以MyWrapper代码可以得到增强 详情如下:

public class MyWrapper
{
  public LibraryObject MyWrappedCall()
  {
    //LibraryObject x = ExternalLibrary.getLibObject();
    MyMockLibraryObject mlo;
    return mlo;
  }

  public class MyMockLibraryObject extends LibraryObject
  {
    public ProductionType doSomething()
    {
      ProductionType pt;
      return pt;
    }
  }
}
这样做的问题是父类有一个私有构造函数,因此它不能被子类化


有人对如何避开这一点有什么建议吗

听起来很糟糕。您需要创建一个包装器接口(和实现),用于从生产代码中隐藏LibraryObject类型,以便可以模拟接口。最简单的解决方案是只模拟您需要模拟的任何第三方类型(但如果可能,更喜欢不模拟的集成测试)


对于Java,可以使用PowerMock或JMockit库执行这种模拟,而无需创建任何包装器。(当然,如果所说的包装器带来了其他好处,那么您可能更愿意保留它们。)这些模拟库不通过创建子类来运行,因此它们不像那些子类那样受到约束。

我不太担心LibraryObject类型在生产代码中,因为它已经在外观中了。我所要做的就是返回一个我可以控制的对象,这样我就可以选择在调用时返回给该对象的内容。