オブジェクトとやり取りするコードがあり、その上で finish() メソッドを呼び出す必要があります。
void completeTransaction(PaymentTransaction transaction) {
recordTransaction(transaction.getId());
transaction.finish();
}
PaymentTransaction は、その後の動作finish()
が定義されていないサードパーティ クラスです。例外がスローされるか、サイレントに失敗する可能性があります。
その時だけ合格する単体テストを書く必要があります:
recordTransaction(transaction.getId())
と呼ばれるtransaction.finish()
と呼ばれるtransaction.finish()
後に呼ばれるrecordTransaction(transaction.getId())
上記の条件を満たすテストでは、次のようなコードを禁止する必要があります。
void completeTransaction(PaymentTransaction transaction) {
transaction.finish();
recordTransaction(transaction.getId()); //oops
}
最初の条件のテスト ケース:
void testCompleteTransaction_TransactionRecorded() {
completeTransaction(transactionMock);
// assert that recordTransaction(transaction.getId())
// called with correct argument
completeTransaction(PaymentTransaction transaction) } 2 つ目の場合:
void testCompleteTransaction_TransactionCompleted() {
completeTransaction(transactionMock);
// assert that transaction.finish() called
}
テストケースを介して3番目の条件をどのように強制できるのだろうか。