2013-09-23 7 views
0

사람들 JUnit을 처음 사용하고 그것에 대해 잘 이해하고 있습니다. 지금 당장은 JUnit 테스트를 생성 할 때 (직접 그래프를 생성하는 Digraph 클래스의 경우), 읽을 때 IllegalArgumentException을 던집니다. 음수 int 값이며 모든 것이 ok (노드 값의 수)가 0보다 큰 경우 그래프를 만듭니다.JUnit 테스팅 생성자 테스팅

소리를 나타내는 두 글자 클래스 : 나는 하나 (또는 ​​2) 테스트 케이스를 사용하는 경우 모두를 테스트하는 방법

@Rule 
    public ExpectedException exception = ExpectedException.none(); 

@Test(expected = IllegalArgumentException.class) 
public void DigraphIn() { 

    Digraph G = new Digraph(in.readInt()); 

    exception.expect(IllegalArgumentException.class); 
    exception.expectMessage("Vertices can't be nagative"); 
    exception.expectMessage("Invalid input format in Digraph constructor"); 
    exception.expectMessage("Number of edges in a Digraph must be nonnegative"); 
try{ 
}catch (AssertionError e){ 
    } 
} 

을 : 아래

In in = new In(); 
public Digraph(In in) { 
    try { 
    this.nodes = in.readInt(); 
    System.out.println("Total nodes in graph: "+ nodes); 
    if (nodes < 0) throw new IllegalArgumentException("Number of vertices must be > 0); 
    int E = in.readInt(); 
    if (E < 0) throw new IllegalArgumentException("Number of edges must be >0); 
    }catch (NoSuchElementException e) { 
    throw new InputMismatchException("Invalid input format in Digraph constructor"); 
    } 

내가 쓰기를 시도하고있는 테스트입니다 ? "in"에 의해 -ve 값이 감지되지 않으면 java.lang.AssertionError를 얻습니다. 그렇지 않으면 테스트가 통과합니다. 미리 감사드립니다.

답변

2

많은 테스트 케이스가 있습니다. 각 예외마다 하나씩 갖는 것이 좋습니다.

수행 할 테스트는 다르기 때문에 다르게 취급해야합니다.

좋은 참조는 Junit Cookbook입니다.

실제로 코드에서 오류가 발생했습니다. 테스트 사례에서 다음과 같이 공동 작업자를 조롱 할 수 있습니다. 나는 각 호출마다 'mockito'mocks 라이브러리를 사용하여 다른 값을 반환하는 모의 객체를 만들었습니다.

@Test(expected = IllegalArgumentException.class) 
public void DigraphInThatThrowsExceptionForVertices() { 
    In in = Mockito.mock(In.class); 
    when(in.readInt()).thenReturn(-1); 
    Digraph G = new Digraph(in); 
    fail(); 
} 

@Test(expected = IllegalArgumentException.class) 
public void DigraphInThatThrowsExceptionForEdges() { 
    In in = Mockito.mock(In.class); 
    when(in.readInt()).thenReturn(10).thenReturn(-1); 
    Digraph G = new Digraph(in); 
    fail(); 
} 

@Test 
public void DigraphInThatDoesNotThrowException() { 
    In in = Mockito.mock(In.class); 
    when(in.readInt()).thenReturn(10).thenReturn(15); 
    Digraph G = new Digraph(in.readInt()); 
} 

이 방법으로 테스트 코드가 깨끗하고 읽기 쉬운 :

당신은 기본적으로 뭔가를해야합니다.

+0

csoroiu을 :

시험에있어서 만 실행 당 하나 개의 예외를 발생시킬 수 있기 때문에, 예외가 발생 될 수있는 장소의 각각에 대해 하나 개의 시험 방법이 있어야 각 예외에 대해 별도의 테스트를해야합니까 ?? 왜냐하면 내가하지 않으면 AssertionError가 발생하기 때문입니다! – user1569891

+0

@ user1569891 게시물을 업데이트 했으므로 각 예외에 대해 하나의 메소드가 필요합니다. In 클래스를 조롱하거나 각 테스트에 대해 'Digraph'생성자가 해당 테스트에 필요한대로 동작하는 데 필요한 값을 반환하는 클래스를 만들 수 있습니다. – Claudiu

+1

'ExpectedException'을 사용하는 것이 더 낫습니다.이 테스트에서는 예외가 던져지는 곳을 확인할 수 없습니다 .. – Tobb

1

메서드를 테스트 할 때 실제로 호출하면 메서드가 실행됩니다. 예외는 메소드의 나머지 처리를 취소하기 때문에 테스트는 테스트 당 하나의 예외 만 검증 할 수 있습니다. 따라서 예외를 throw 할 수있는 각 위치에 대해 하나의 테스트가 필요합니다. 예외는 단위 테스트와 함께 발생되는 것을 확인

는 그것을 할 수 기본적으로 3 가지 방법이 있습니다 :

시도-catch 블록 다음 @Test

@Test 
public void myTest() { 
    try { 
     myClass.myMethod(42); 
     fail(); 
    } catch(final IllegalArgumentException e) { 
     assertEquals("something went wrong", e.getMessage()); 
    } 
} 

expected -attribute -annotation :

@Test(expected=IllegalArgumentException.class) 
public void myTest() { 
    myClass.myMethod(42); 
} 

ExpectedException :

@Rule 
public ExpectedException expectedException = ExpectedException.none(); 

@Test 
public void myTest() { 
    expectedException.expect(IllegalArgument.class); 
    expectedException.expectMessage("something went wrong"); 

    myClass.myMethod(42); 
} 

예를 들어 세 가지 모두를 사용하려고합니다.

예외를 테스트하는 방법을 비교하면 실제로 첫 번째와 세 번째 예외가 throw되는 예외에 대한 확인을 수행 할 수 있으므로 동일한 유형의 예외가 여러 위치에서 발생할 수있는 테스트 방법에 적합합니다 그런 다음 예외 메시지를 사용하여 예외가 발생한 장소에서 예외가 발생했는지 확인할 수 있습니다.

두 번째 것은 가장 읽기 쉽지만 테스트 할 메소드에 의해 던져지는 예외를 구분할 수는 없으며 대부분의 경우 다른 두 값만큼 많은 값을 제공하지 않습니다.

첫 번째와 세 번째 중 세 번째는 가장 읽기 쉽고 개인적으로도 가장 좋아합니다. 그래서 거기

public class DiagraphTest { 

    @Rule 
    public ExpectedException expectedException = ExpectedException.none(); 

    private Diagraph diagraph; 
    private In in; 

    @Before 
    public void setup() { 
     in = mock(In.class); 
    } 

    @Test 
    public void constructorShouldThrowExceptionWhenNumberOfVerticesIsLessThanOne() { 
     expectedException.expect(IllegalArgumentException.class); 
     expectedException.expectMessage("vertices must be > 0"); //expectMessage only needs a substring of the exception-message 

     doReturn(-1).when(in).readInt(); 

     new Diagraph(in); 
    } 

    @Test 
    public void constructorShouldThrowExceptionWhenNumberOfEdgesIsLessThanOne() { 
     expectedException.expect(IllegalArgumentException.class); 
     expectedException.expectMessage("edges must be > 0"); 

     when(in.readInt()).thenReturn(42, -1); 

     new Diagraph(in); 
    } 

    //as to the last exception, I really can't see that it will ever be thrown in that try-block, but here's a test for that as well.. 
    @Test 
    public void constructorShouldThrowInputMismatchExceptionIfReceivedNoSuchElementException() { 
     expectedException.expect(InputMismatchException.class); 
     expectedException.expectMessage("Invalid input format); 

     doThrow(new NoSuchElementException("phail")).when(in).readInt(); 

     new Diagraph(in); 
    } 

}