2009-12-01 2 views
3

У меня есть следующий кодКак проверить с EasyMock Capture

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

Метод registerNewRecord вызывает метод вставки RecordDao и updateRecord вызывает метод обновления на том же DAO.

У меня есть следующий код: EasyMock

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

как проблема, так как выше й тот же экземпляр записи, который был вставлен в настоящее время обновляется, объект съемки insertRc обновляемой тоже. Поэтому я не могу утверждать, что для установленного флага установлено значение false во время вставки.

Что я делаю неправильно?

ответ

1

Одна из идей - клонировать объект Record, когда вы его захватываете.

Реализовать метод clone() в классе записи, а затем реализовать пользовательский захват следующим образом:

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 и сохранить его.

3

Если ссылки в пределах insertRC и updateRC оба относятся к одному объекту rd и это изменяется при методе update, вы всегда будете видеть, что Record объект завершен. Тем не менее, вы можете протестировать первый объект Captured перед вызовом 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()); 
0

Захваты - это не ответ. Проблема в том, что ваш код создает новый объект в registerNewRecord (или, как я полагаю). Нет способа получить объект, который вы создаете, с new до того, как код, который вы тестируете, завершен. Захваты позволяют задавать вопросы об объекте, созданном/полученном во время выполнения, ПОСЛЕ завершения тестового метода.

Другая проблема с вашим тестом заключается в том, что ваш тест на текущий метод зависит от кода в методе registerNewRecord() и, возможно, от любого кода в конструкторе объекта Record. Один из способов разбить эту зависимость и проверить промежуточное состояние объекта Record - это заглушить метод registerNewRecord() и вернуть ему макет. Затем вы можете проверить, что правильные вызовы были сделаны для объекта 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(), чтобы убедиться, что он работает правильно.

Смежные вопросы