我想編寫一個單元測試(使用JMockit),驗證方法是否按部分順序調用。具體用例是確保某些操作在交易中被調用,但更一般地,我想驗證這樣的事情:在JMockit驗證部分排序的方法調用
- 方法
beginTransaction
被調用。 - 方法
operation1
到operationN
以任意順序調用。 - 方法
endTransaction
被調用。 - 方法
someOtherOperation
在交易之前,期間或之後的某個時間被調用。
Expectations和驗證API似乎無法處理此要求。
如果我有一個@Mocked BusinessObject bo
我可以驗證正確的方法調用(以任意順序)與此:
new Verifications() {{
bo.beginTransaction();
bo.endTransaction();
bo.operation1();
bo.operation2();
bo.someOtherOperation();
}};
可選使其成爲一個FullVerifications
檢查有沒有其他的副作用。
要檢查排序約束,我可以做這樣的事情:
new VerificationsInOrder() {{
bo.beginTransaction();
unverifiedInvocations();
bo.endTransaction();
}};
但這不處理someOtherOperation
情況。我無法替換unverifiedInvocations
和bo.operation1(); bo.operation2()
,因爲這會使合計排序在調用上。業務方法的正確實施可以撥打bo.operation2(); bo.operation1()
。
如果我讓:
new VerificationsInOrder() {{
unverifiedInvocations();
bo.beginTransaction();
unverifiedInvocations();
bo.endTransaction();
unverifiedInvocations();
}};
然後我得到一個「沒有驗證的調用左」失敗時someOtherOperation
被交易之前調用。嘗試bo.someOtherOperation(); minTimes = 0
也不起作用。
因此:在JMockIt中使用Expectations/Verifications API是否有一種乾淨的方法來指定方法調用的部分排序要求?還是我必須使用MockClass
和手動跟蹤的調用,一拉:
@MockClass(realClass = BusinessObject.class)
public class MockBO {
private boolean op1Called = false;
private boolean op2Called = false;
private boolean beginCalled = false;
@Mock(invocations = 1)
public void operation1() {
op1Called = true;
}
@Mock(invocations = 1)
public void operation2() {
op2Called = true;
}
@Mock(invocations = 1)
public void someOtherOperation() {}
@Mock(invocations = 1)
public void beginTransaction() {
assertFalse(op1Called);
assertFalse(op2Called);
beginCalled = true;
}
@Mock(invocations = 1)
public void endTransaction() {
assertTrue(beginCalled);
assertTrue(op1Called);
assertTrue(op2Called);
}
}
覈查,API支持這裏有多個驗證模塊,這將是解決辦法:'someOtherOperation'應該在普通塊*之前*有序進行驗證驗證塊包含對'unverifiedInvocations()'的調用。但是,JMockit目前不支持這種特定的組合。我將嘗試修復0.999.9的版本。 – 2011-05-04 12:02:52
但這是否真正支持部分排序的場景?要求bo.operation1()和bo.operation2()必須bo.beginTransaction(後兩者發生)和bo.endTransaction()之前,但交易中的兩個操作可以以任意順序進行。這正是我也需要測試的場景。 – SamStephens 2013-03-21 20:28:02