我应该测试预计不会发生任何事情的情况

Héc*_*tor 10 java unit-testing

Sample,如果状态可以删除SP.我有这个测试:

@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());
}
Run Code Online (Sandbox Code Playgroud)

我应该走得更远吗?如何在无法删除样本时进行测试?例如:

@Test
public void cantBeDeletedWhenStatusINeitherPNorS() {
    Sample sample = new Sample();
    sample.setState("Z");
    assertFalse(sample.canBeDeleted());
}
Run Code Online (Sandbox Code Playgroud)

这个测试有用吗?测试命名怎么样?这个逻辑测试会不够?

Gho*_*ica 13

SaintThread正在给你一个很好的"直接"答案.

但让我们退后一步.因为您在生产代码中做错了什么.最有可能的是,您的生产代码执行类似于表示样本状态的String的开关.不仅一次,而且在它提供的所有方法中.而且......这不是一个好的OO设计!

相反,你应该使用多态,如:

abstract class Sample {
  boolean canBeDeleted();
// ... probably other methods as well
Run Code Online (Sandbox Code Playgroud)

和各种具体的子类一样

class ZSample extends Sample {
  @Override canBeDeleted() { return false; }
// ...
Run Code Online (Sandbox Code Playgroud)

最后,你有

class SampleFactory {
  Sample createSampleFrom(String stateIdentifier) {
  // here you might switch over that string and return a corresponding object, for example of class ZSample
Run Code Online (Sandbox Code Playgroud)

然后,您的测试归结为:

  1. 测试工厂; 输入"Z"的示例,它返回ZSample的实例
  2. 测试Sample的所有子类; 例如,canBeDeleted()为ZSample的实例返回false

关键是:您的代码确实完成了FSM(有限状态机)的工作.然后不要在整个地方使用if/elses; 相反,做OO的事情:创建一个显式的状态机.而且,免费奖励:这种方法也可以将你的Sample对象变成不可变的东西; 这通常比必须处理可以随时间改变其状态的对象更好(例如,不变性对多线程问题有很大帮助).

免责声明:如果您的"样本"类只是关于那一种方法,那么上述内容可能过度.但在任何其他情况下......也许退一步看看我的建议是否会为您的设计增添价值!