所以我正在编写一个类,我希望遵循最佳实践并可测试。我有一个新的对象要在里面创建。所以,我遵循工厂模式来实现它。
public class Apple {
// factory object injected in class
private SeedFactory seedFactory;
// Method to be tested
public void myMethod(String property1, int property2, String depends) {
// Just to set the necessary parameter
seedFactory = new SeedFactory(property1, property2);
// Factory pattern intact. Instance generation depends on only one parameter
SeedFactory result = seedFactory.getInstance(depends);
}
}
编辑:添加工厂代码。
public class SeedFactory{
String property1;
int property2;
SeedFactory(property1,property2){
this.property1 = property1;
this.property2 = property2;
}
SeedFactory getInstance(int depends){
if(depends == 1)
{ // do stuff }
else{ // do stuff and return instance }
现在,在实际创建新对象之前,我必须确保为要生成的新实例设置了两个属性,无论工厂生成的实例类型如何,这些属性都需要存在。depends
是实际参数,它告诉工厂返回哪个实例。
现在,就这段代码的可测试性而言,我可以使用PowerMockito
来使用whenNew
模拟工厂对象,但使用PowerMockito不是一种选择。我必须让它在没有它的情况下可以测试。
此外,我还尝试将new
调用封装在一行函数中,然后使用spy
。但我想避免使用spy
,因为在整个代码使用的上下文中,这并不是一个好的做法。
所以我的问题是,在不使用PowerMockito的情况下,有没有任何方法可以重写这个类,以便对其进行正确的单元测试?
如果要生成的实例只需要一个参数,那么它将是微不足道的。但是,我不想向getInstance()
传递多个参数。
SeedFactory
不是苹果的依赖项,但您的方法依赖于具有"使用"关系的SeedFactory
。因此,为了定义正确的关系,我建议您使用以下"使用"关系:
public void myMethod(SeedFactory seedFactory, String depends){ // Method to be tested
现在您可以模拟SeedFactory
并对其进行适当的单元测试。
我认为你做错了什么。
如果SeedFactory
不是Apple
的依赖项,而是一个内部问题,那么就不需要模拟SeedFactory
来测试Apple
。您应该只测试苹果提供的公共API。
如果SeedFactory
是Apple
的依赖项,那么它肯定应该被注入。