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类型在生产代码中,因为它已经在外观中了。我所要做的就是返回一个我可以控制的对象,这样我就可以选择在调用时返回给该对象的内容。