我有一些带有几种方法的界面
public interface Turret {
void firePrimary();
void fireSecondary();
void reloadPrimary();
.......
}
我实现了它有保护字段。在我对上述方法的实现中,我更改了受保护字段的值。
@Override
public void firePrimary() {
if(shootablePriAmmo > 0) {
shootablePriAmmo--; //Shootable ammo is a protected field inside the implementation
}else{
reloadPrimary();
}
}
现在我正在尝试测试fire primary方法并检查shootablePriAmmo
值是否已更改,但由于这是一个接口实现,我无法使用接口方法访问字段而我不想写接口中用于访问这些字段的方法,因为除了测试之外,其他任何地方都不会使用这些方法。如果我只在实现类上编写单元测试,那么我必须为这些字段创建公共getter,我不认为这是正确的方法。我该怎么做才能克服这个问题?我违反任何OOP原则吗?
修改 这是实现的构造函数
public BasicTurret(int maxPriAmmo, int maxSecAmmo, int priAmmoCap, int secAmmoCap) {
this.maxPriAmmo = maxPriAmmo;
this.maxSecAmmo = maxSecAmmo;
this.curPriAmmo = priAmmoCap;
this.curSecAmmo = secAmmoCap;
this.priAmmoCap = priAmmoCap;
this.secAmmoCap = secAmmoCap;
this.shootablePriAmmo = priAmmoCap;
this.shootableSecAmmo = secAmmoCap;
}
答案 0 :(得分:1)
您可以创建一个对象,该对象保存从这些方法更改的值的状态。然后通过构造函数传递一个mock。
答案 1 :(得分:1)
介绍弹药夹持器接口以封装弹药操作并简化测试
interface AmmoHolder {
getMax();
get/setCur(); // consume or reload
getShootable();
getCap();
}
class BasicTurret(AmmoHolder primary, AmmoHolder secondary) {
this.primaryAmmo = primary;
this.secondaryAmmo = secondary;
}
答案 2 :(得分:0)
通常为实现创建单元测试,而不是为接口创建单元测试,因此在单元测试中,您需要实例化要测试的类作为对实现的引用,而不是接口(在您的情况下 - BasicTurret )。单元测试通常也放在与原始类相同的包中,因此如有必要,他们可以访问受保护的字段/方法。
BasicTurret turret = new BasicTurret(.., .., 5, ..);
turret.firePrimary();
assertEquals(4, turret.shootablePriAmmo);