2015-10-09 39 views
1

我有几个方法如何从接口实现接入领域的测试

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(); 
    } 
} 

现在我想测试火灾主要方法,并检查shootablePriAmmo值是否被更改或没有,但因为这是一个接口的实现,我不能与接口的方法访问的字段,我不想写用于访问这些字段的接口中的方法,因为除了测试之外,这些方法不会在其他任何地方使用。如果我只在实现类上编写单元测试,那么我必须为这些字段创建公共getter,但是我没有看到它是正确的方式。我该怎么做才能克服这个问题?我违反任何面向对象的原则吗?

编辑 这里是实现

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

能否请您做一个标志一样吗? –

+0

@suresh我不明白你的意思。 – Sneh

回答

1

介绍弹药架接口,封装弹药操作和简化测试

interface AmmoHolder { 
    getMax(); 
    get/setCur(); // consume or reload 
    getShootable(); 
    getCap(); 
} 

class BasicTurret(AmmoHolder primary, AmmoHolder secondary) { 
    this.primaryAmmo = primary; 
    this.secondaryAmmo = secondary; 
} 
+0

谢谢,这正是我想要的。 – Sneh

+0

嘿只是想问一件事,就是有必要使用接口或我可以用一个具体的类做到这一点。目前我使用的具体类,我将只是有一个实现AmmoHolder的并且还通过实际的例子一ammoholder类似于对象不是一个服务去。 – Sneh

+0

当然你可以使用具体的类。我更喜欢使用接口来保持域模型清晰。但它的程序,所以你可以做任何你想要的。 – ursa

1

您可以创建一个保存状态的值,从这些方法改变对象的构造函数。然后通过构造函数进行模拟。

+0

这是一个很好的计划,但我有我不通过构造函数传递领域。所以我无法保持他们的轨道。 – Sneh

+0

他们现在是如何设置的?在Default构造函数里面?塞特斯? –

+0

编辑并添加构造函数。 – Sneh

0

单元测试通常为实现创建的,而不是一个接口,所以在你的单元测试,你需要实例要测试来实现,而不是一个接口的引用(一类你的情况 - BasicTurret)。单元测试通常也放在与原始类相同的包中,因此如果需要的话,他们可以访问受保护的字段/方法。

BasicTurret turret = new BasicTurret(.., .., 5, ..); 
turret.firePrimary(); 
assertEquals(4, turret.shootablePriAmmo);