![](/img/trans.png)
[英]EasyMock how to capture argument of a void method called by method under test?
[英]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。
我究竟做錯了什么?
如果insertRC
和updateRC
的引用都引用同一個對象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.