2013-03-01 3 views
4

EasyMock을 사용하여 junit 테스트 케이스를 만들고 있습니다. 지금까지는 POJO를 반환 할 것으로 기대되는 클래스에 대해서는 의미가 있지만, 그 자체로 예외를 던질 수있는 DAO 객체를 다루는 방법은 무엇입니까? 내 테스트 케이스는 DAO가 문제를 발견했을 때 발생하는 예상 된 예외를 검사하는 것이다. EasyMock 사용하기 나는 DAO 객체 (foo 클래스에서 테스트)를 시도하고 저격 DAO 예외를 처리하는 올바른 방법은 무엇인가?EasyMock Exception Handling

클래스/간단한 전화의 예는 다음과 같습니다 : 나는 할 수 있도록하려면 내가하려고하면

public class foo{ 
    private daoClass dao = daoClass.getInstance(); 
    public String getValueFromDB(String key) throws DBException{ 
     return dao.lookup(key); 
    } 
} 

public class daoClass{ //singleton DAO 
    public daoClass getInstance(){ 
     //singleton access here 
    } 
    public String lookup(String key) throws DBException{ 
     try{ 
      //DB LOGIC 
     } 
     catch(Exception e){ 
      throw new DBException(e.getMessage()); 
     } 
    } 
} 

(모든 게터/세터/생성자가 유효하고 존재 가정)과 foo 클래스를 테스트 이 DBException을 테스트하십시오. 내가 이것을 어떻게 처리합니까? DAO 호출을 테스트/캐치 (테스트)에서 suronding해야합니까? 아니면 테스트에 throw를 추가할까요? 나는 그것이 던져지면 expected=DBException이 테스트를 통과한다는 것을 안다.하지만 내부적으로 예외를 몇 개 처리해야 하는가?

테스트 코드의 예 :

@Test(expected=DBException.class) 
public void testFooError(){ 
    String key = "test"; 
    String value = "expected"; 
    daoClass daoMock = createMock(daoClass.class); 
    try{ 
     expect(daoMock.lookup(key)).andReturn(value); 
    } catch (DBException e){ 
     // ??? 
    } 
} 

expect 잠재적 오류를 던질 수있을 때 처리하는 올바른 방법은 무엇입니까? 테스트 방법 throw을 예외로 사용하거나 try/catch을 사용해야합니까? 테스트에서 expected=EXCEPTION 태그를 사용하는 것이 맞습니까?

답변

5

내가 단위 테스트에서 예외를 처리하는 방법은 그것이 던지기를 기대하면 그것은 시험 실패입니다. 예를 들어,

@Test 
public void testFooNormal() throws DBException{ 
    String key = "test"; 
    String value = "expected"; 
    daoClass daoMock = createMock(daoClass.class); 
    expect(daoMock.lookup(key)).andReturn(value); 
    // do an assert on returned value 
    ... 
} 

당신이 명시 적으로 예외 테스트하는 경우 그런 다음이 (당신이 기대하는 예외의 좁은 버전을 잡기)에서 발생 될 것으로 예상되는 라인 주위에 시도 - 캐치를 넣고 설정 catch 절의 boolean 값과 boolean 값은 boolean 값이어야한다. 예를 들어,

@Test 
public void testFooError(){ 
    String key = "test"; 
    String value = "expected"; 
    boolean exceptionThrown = false; 
    daoClass daoMock = createMock(daoClass.class); 
    try{ 
     expect(daoMock.lookup(key)).andReturn(value); 
    }catch (DBException e) { 
     exceptionThrown = true; 
    } 
    // assert exceptionThrown is true 
    ... 
} 

이것은 당신이 테스트하는 의미하기 때문에 예외를 테스트 할 수있는 좋은 방법입니다뿐만 아니라 올바른 예외가 발생하는 것이 아니라 그것은 당신이 예상 정확히 라인에서 던진 있다고. @test (expected = ...)를 사용하면 테스트의 다른 행이 해당 예외를 throw하여 테스트가 잘못 전달 될 수 있습니다.

+0

그래서 (예외가 예상되는) 하단 케이스가 있으므로 ('expected = Exception.class ') 그 경우에는 중단해야합니다? – Walls

+0

예,이 경우에 입력 할 필요가 없습니다. – combinatorics

+0

'exceptionThrown' 로직에 대한 빠른 설명 ...EasyMock 객체에 대한'expect' 호출을 중심으로이 예외를 기대하고 싶습니다. 아니면 실제로 모의 객체를 사용하고 catch를 시작하려고 할 때 테스트 코드에서 그 논리를 사용해야합니다. try {expect()} catch {DO NOTHING} ... ' 'try {foo.getValueFromDB (value)} catch (예외 e) {exceptionThrown = true;}' – Walls

3

DAO 논리는 테스트를 기준으로 변경하면 안됩니다. DAO가 예외를 던지기를 기대한다면, 그런 식으로 유지하고 테스트중인 방식으로 예외를 테스트하십시오.

DAO 자체에서 예외를 catch하여 롤백 또는 로깅 등을 수행하는 경우 테스트 사례는 테스트 사례 시나리오가 아니므로 예외를 기대해서는 안됩니다. DAO가 NULL을 반환 할 것으로 예상 할 때이 경우 NULL을 확인할 수 있습니다. 당신이 명시 적으로 당신이이 방법에 throws 절에 추가해야 예외를 테스트하지 않는 경우

- 예외가 발생 된 경우 당신은하지 않았다 : 여기