2009-12-01 2 views
3

다음 코드가 있습니다.easymock 캡처로 테스트하는 방법

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 캡처 개체가 업데이트되고 있기 때문입니다. 그래서 나는 완성 된 플래그가 삽입시 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 메소드에서 필요한 정보 (예 : Record finished flag)를 추출하여 저장할 수 있습니다. insertRCupdateRC 모두 내에서 참조가 동일한 개체 rd을 참조 이것은 update 방법 중 변경되는 경우

3

, 당신은 항상 Record 개체가 완료되었음을 볼 수 있습니다. 그러나 update 호출이 이루어지기 전에 첫 번째 Captured 객체를 테스트 할 수 있습니다.

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() 메서드를 스텁 (stub)하여 모의 객체를 반환하는 것입니다. 그런 다음 올바른 호출이 Record 객체에 대해 수행되었으며 코드가 레코드 객체의 모든 가능한 반환 값에 대해 올바르게 작동하는지 테스트 할 수 있습니다. 이 테스트중인 방법의 코드에 뭔가 문제가 결코 문제가 기록의 생성자 또는 registerNewRecord에있는 경우는 휴식 때

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 
} 

긍정적 인 효과로서, 당신은 테스트 만 나누기 찾을 수 있습니다. 그러나 올바르게 작동하는지 확인하기 위해 registerNewRecord() 메소드에 대한 두 번째 테스트를 작성해야합니다.