簡體   English   中英

如何使用easymock Capture進行測試

[英]How to test with easymock Capture

我有以下代碼

Record rd = registerNewRecord();
<do some processing>
rd.setFinished(true);
updateRecord(rd);

registerNewRecord方法調用RecordDao插入方法,updateRecord調用同一DAO上的update方法。

我有以下easymock代碼:

Capture<Record> insertRc = new Capture<Record>();
RecordDao.insert(capture(insertRc));
Capture<Record> updateRc= new Capture<Record>();
RecordDao.update(capture(updateRc));

問題是從上面開始,更新了插入的Record的同一個實例,insertRc Capture對象也在更新。 所以我不能斷言在插入時將完成標志設置為false。

我究竟做錯了什么?

如果insertRCupdateRC的引用都引用同一個對象rd並且在update方法期間更改了此對象,則始終會看到Record對象已完成。 但是,您可以在進行update調用之前測試第一個捕獲的對象。

Capture<Record> insertRc = new Capture<Record>();
RecordDao.insert(capture(insertRc));
Record insertedRecord = insertRC.getValue();
org.junit.Assert.assertFalse(insertedRecord.isFinished());

Capture<Record> updateRc= new Capture<Record>();
RecordDao.update(capture(updateRc));
Record updatedRecord = updateRC.getValue();
org.junit.Assert.assertTrue(updatedRecord.isFinished());

一個想法是在捕獲它時克隆Record對象。

在Record類中實現clone()方法,然后按如下方式實現自定義Capture:

public class RecordCloneCapture extends Capture<Record> {
    @Override
    public void setValue(Record value) {
        super.setValue(value == null ? null : value.clone());
    }
}

並更改您的測試代碼以使用它:

Capture<Record> insertRc = new RecordCloneCapture();
RecordDao.insert(capture(insertRc));
Capture<Record> updateRc= new RecordCloneCapture();
RecordDao.update(capture(updateRc));

如果由於某種原因無法實現clone() ,則自定義Capture類可以在setValue方法中提取所需的信息(即Record finished標志)並存儲它。

捕獲不是答案。 問題是你的代碼是在registerNewRecord中創建一個新對象(或者我認為是這樣)。 在您測試的代碼完成之前,無法使用new創建對象。 捕獲允許您在測試方法完成后詢問在執行期間創建/獲取的對象的問題。

您的測試的另一個問題是您對當前方法的測試取決於registerNewRecord()方法中的代碼以及Record對象的構造函數中的任何代碼。 打破這種依賴關系並驗證Record對象的中間狀態的一種方法是將registerNewRecord()方法存根並讓它返回一個mock。 然后,您可以測試對Record對象的正確調用,以及您的代碼對記錄對象的所有可能返回值的行為是否正確。

MyClassStub extends MyClass {
  Record registerNewRecord() {
    return recordMock;
  }
}

MyClass objectToTest = new MyClassStub();

public void testSomeMethod() {
   // set expectations, call replay
   objectToTest.someMethod();  // (contains above code that calls registerRecord)
   // asserts/verify
}

作為一個積極的副作用,您會發現只有當您正在測試的方法中的代碼出現問題時,您的測試才會中斷,如果問題出在Record的構造函數或registerNewRecord中,則永遠不會中斷。 但是,您需要為registerNewRecord()方法編寫第二個測試,以確保它正常工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM