2012-07-22 3 views
7

다른 구현 자에 의해 구현 될 인터페이스 MyInterface을 작성했습니다.일반 JUnit 테스트 클래스

또한 모든 구현자가 구현을 테스트하는 데 사용할 수 있어야하는 일반 테스트 메서드가 포함 된 MyInterfaceTest 클래스를 작성했습니다.

JUnit 테스트로 작동시키는 법을 모르겠습니다.

현재,이 같은있다 : 각 구현의 초기화 시간이 많이 걸리기 때문에

public class MyInterfaceTest { 
    private static MyInterface theImplementationToTest = null; 

    @BeforeClass public static void setUpBeforeClass() throws Exception { 
       // put your implementation here: 
     theImplementationToTest = new Implementation(...); 
    } 

    @AfterClass public static void tearDownAfterClass() throws Exception { 
     theImplementationToTest = null; 
    } 

    @Test public void test1() { /* uses theImplementationToTest */ }  
    @Test public void test2() { /* uses theImplementationToTest */ }  
} 

내가 정적 메서드 setUpBeforeClass를 사용합니다, 그래서 모든 시험에 한 번 초기화합니다.

이 버전의 테스트에서는 구현자가 setUpBeforeClass 코드를 변경하고 자체 구현을해야합니다.

MyInterfaceTest을 작성하는 다른 방법이 있으므로 구현 자들이 상속하거나 매개 변수를 보내고 코드를 변경하면 안됩니다. 그러나 JUnit에서 충분히 경험할 수있는 것은 아닙니다. 이 방법을 보여 주시겠습니까?

답변

6

하위 클래스가 이전 클래스 메서드 만 구현하고 모든 테스트를 상속받을 수 있습니다.

import org.junit.*; 

public abstract class MyInterfaceTest { 
    protected static MyInterface theImplementationToTest = null; 

    @AfterClass 
    public static void tearDownAfterClass() throws Exception { 
     theImplementationToTest = null; 
    } 

    @Test 
    public void test1() { /* uses theImplementationToTest */ 
    } 

    @Test 
    public void test2() { /* uses theImplementationToTest */ 
    } 
} 

일반적으로,이 방법 추상적를 구현하는 데 필요한 서브 클래스를 만들 것입니다 :

import org.junit.*; 

public class ImplementingClassTest extends MyInterfaceTest { 

    @BeforeClass 
    public static void setUpBeforeClass() throws Exception { 
     // put your implementation here: 
     theImplementationToTest = new MyInterfaceImpl(); 
    } 

} 

이것은 같은 모양을 작성하는 추상 클래스가 있습니다. 정적 설정 방법이므로 여기서는 할 수 없습니다. (또한 종종 안티 패턴이기 때문에 인스턴스화가 오랜 시간이 걸리지 않도록 리팩토링하는 것이 좋습니다.)

-3

병 이름 junit-4.10.jar을 다운로드하여 프로젝트에 추가해야합니다. 그런 다음 MyInterfaceTest 클래스를 public class MyInterfaceTest extends TestCase과 같은 TestCase 클래스를 상속 받도록하십시오.

+1

어떻게 원래 문제를 해결할 수 있습니까? –

+0

원래 문제는 무엇입니까? –

+0

서브 클래스에 따라 구현이 다른 정적 설정/분해 (teardown)를 재사용하는 방법. 내 대답에 설명 된대로. –