gpt4 book ai didi

java - 我是否需要创建工厂的测试版本以进行单元测试?

转载 作者:行者123 更新时间:2023-12-01 07:47:57 25 4
gpt4 key购买 nike

我使用 ShipFactory 创建船舶对象,但我的船舶依赖于 Acclerometer 类(只是 Android 加速度计的包装器)。所以我有我的工厂,当它 build 一艘船时,将一个加速度计传递给船舶 builder 。

这是我的 ShipFactory:

public class ShipFactory {
private int screenX;
private int screenY;
private Context context;

private Bitmap bitmap;

// How can I mock this from in my factory?
private Accelerometer accel;

private Ship ship;

public ShipFactory(Context context){
this.context = context;
accel = new Accelerometer(context);
}

public Ship makeShip(String shipType){
bitmap = BitmapFactory.decodeResource(context.getResources(),R.drawable.myship)
ship = new Ship(context,screenX,screenY,bitmap,accel);
return ship;
}
}

所以我造了一艘这样的船:

   ShipFactory shipFactory = new ShipFactory(context);
ship = shipFactory.makeShip("enemy");

但是现在假设我想要合并我的飞船类并且我想要模拟这些依赖关系。上下文很容易模拟,因为我可以将模拟上下文传递给我的工厂,但我的工厂仍然依赖于加速度计。

对于单元测试,我应该创建一个新工厂只是为了测试吗?或者使用工厂的一个好处是,在我的单元测试中,我可以完全放弃工厂,并通过将我的模拟传递给船舶构造函数来直接创建一艘新船。

最佳答案

您的ShipFactory取决于Ship。但是 Ship 并不依赖于 ShipFactory。独立于 ShipFactory 测试您的 Ship。由于没有依赖关系,因此不需要依赖注入(inject)。

现在,当你的工厂变得更大时,你应该专门为你的工厂编写测试。为了实现这一目标,我建议提取所有依赖项并将它们注入(inject)到构造函数中。您可以重载构造函数来帮助您完成此操作:

// you can use this for convenience
public ShipFactory(Context context){
this(new BitmapProvider(context), new Accelerometer(context));
}

// use this for testing because you can provide mock versions
public ShipFactory(BitmapProvider provider, Accelerometer accel){
this.provider = provider;
this.accel = accel;
}

// wrapping BitmapFactory because it is a buncha static methods... aka a pain to mock
class BitmapProvider {
Context context;
public BitmapProvider(Context context){
this.context = context;
}

public Bitmap getBitmap(int resId){
return BitmapFactory.decodeResource(context.getResources(), resId);
}
}

关于java - 我是否需要创建工厂的测试版本以进行单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46490907/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com