我认为这个检查应该在代码中执行。否则,代码客户端可能会允许不可接受的序列。
在单元测试中,你可以检查如预期SequenceExample
类行为:
- 如果序列是有效的,没有异常上升。
- 如果序列无效,则异常会阻止客户端代码继续进行。
一些提示:
1)你窝在SequenceExample
很多东西,不使用的SequenceExample
实例。如果您不写实用程序方法,则应该倾向于使用实例和实例方法。
2)方法名称应该是动词不定式形式(约定):洗涤,干和倍和不洗涤,干燥和折叠。
3)每种方法都有特定的行为,应该从客户端代码中调用。使他们私密似乎并不理想。
4)你可以在SequenceExample
中引入一个字段来维护当前状态。 Java枚举可以完成这项工作。
每个方法都可以在执行任务之前检查状态,并在状态不是预期的时候抛出异常。
在方法结束时,状态将被修改。
这里是你的类的修改版本:
public class SequenceExample {
public enum State {
WASHING, DRYING, FOLDING,
}
private State state;
public static void main(String[] args) {
// Shows Sequential Steps for laundry
SequenceExample sequenceExample = new SequenceExample();
sequenceExample.wash(); // Sequence#1
sequenceExample.dry(); // Sequence#2
sequenceExample.fold(); // Sequence#3
}
public void wash() {
if (state != null) {
throw new IllegalStateException("state should be null");
}
System.out.println("Washing - This is Step One of Laundry");
state = State.WASHING;
}
public void dry() {
if (state != State.WASHING) {
throw new IllegalStateException("state should be WASHING");
}
System.out.println("Drying - This is Step Two of Laundry");
state = State.DRYING;
}
public void fold() {
if (state != State.DRYING) {
throw new IllegalStateException("state should be WASHING");
}
System.out.println("Folding - This is Step Three of Laundry");
state = State.FOLDING;
}
}
下面是测试类调用的良好秩序的方法和 3测试不等等等异常的测试上升。
import org.junit.Test;
public class SequenceExampleTest {
SequenceExample sequenceExample = new SequenceExample();
@Test
public void sequenceCorrect() throws Exception {
sequenceExample.wash();
sequenceExample.dry();
sequenceExample.fold();
}
@Test(expected = IllegalStateException.class)
public void sequenceNotCorrectCaseOne() throws Exception {
sequenceExample.dry();
sequenceExample.wash();
}
@Test(expected = IllegalStateException.class)
public void sequenceNotCorrectCaseTwo() throws Exception {
sequenceExample.dry();
sequenceExample.fold();
}
@Test(expected = IllegalStateException.class)
public void sequenceNotCorrectCasethree() throws Exception {
sequenceExample.wash();
sequenceExample.fold();
}
}