java – 我应该测试什么都不会发生的情况

如果状态为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对象变成不可变的东西;这通常比处理可以随时间改变其状态的对象更好(例如,不可变性帮助许多线程问题).

免责声明:如果您的“样本”类仅仅是一种方法,或许以上是过度的.但是在任何其他情况下…也许退后一步,看看我的建议是否会为您的设计增添价值!

相关文章

最近看了一下学习资料,感觉进制转换其实还是挺有意思的,尤...
/*HashSet 基本操作 * --set:元素是无序的,存入和取出顺序不...
/*list 基本操作 * * List a=new List(); * 增 * a.add(inde...
/* * 内部类 * */ 1 class OutClass{ 2 //定义外部类的成员变...
集合的操作Iterator、Collection、Set和HashSet关系Iterator...
接口中常量的修饰关键字:public,static,final(常量)函数...