如果状态为S或P,则可以删除样本.我有以下测试:
@Test public void canBeDeletedWhenStatusIsP() { Sample sample = new Sample(); sample.setState("P"); assertTrue(sample.canBeDeleted()); } @Test public void canBeDeletedWhenStatusIsS() { Sample sample = new Sample(); sample.setState("S"); assertTrue(sample.canBeDeleted()); }
我应该进一步吗当样品不能被删除时,应该如何进行测试?例如:
@Test public void cantBeDeletedWhenStatusINeitherPNorS() { Sample sample = new Sample(); sample.setState("Z"); assertFalse(sample.canBeDeleted()); }
这个测试有用吗测试命名呢?这个逻辑是否足够测试?
解决方法
SaintThread给你一个很好的“直接”答案.
但是让我们退后一步.因为您的生产代码中出现错误.很可能,您的生产代码在该字符串上执行类似于开关的表示样本状态的操作.而不仅仅是一次,而是在它提供的所有方法中.而且…这不是一个很好的OO设计!
相反,您应该使用多态,如:
abstract class Sample { boolean canBeDeleted(); // ... probably other methods as well
与各种具体的子类,如
class ZSample extends Sample { @Override canBeDeleted() { return false; } // ...
最后,你有
class SampleFactory { Sample createSampleFrom(String stateIdentifier) { // here you might switch over that string and return a corresponding object,for example of class ZSample
然后,你的测试归结为:
>测试工厂;输入“Z”的例子,它返回一个ZSample的实例
>测试您的所有子类的Sample;例如对于ZSample的实例,canBeDeleted()返回false
关键是:你的代码做FSM(有限状态机)的工作.那么不要在整个地方使用if / elses;相反,做OO的事情:创建一个明确的状态机.而且,免费红利:这种方法也可以将您的Sample对象变成不可变的东西;这通常比处理可以随时间改变其状态的对象更好(例如,不可变性帮助许多线程问题).
免责声明:如果您的“样本”类仅仅是一种方法,或许以上是过度的.但是在任何其他情况下…也许退后一步,看看我的建议是否会为您的设计增添价值!