我認爲這個檢查應該在代碼中執行。否則,代碼客戶端可能會允許不可接受的序列。
在單元測試中,你可以檢查如預期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();
}
}