2011-08-05 3 views
0

테스트 클래스가 특정 인터페이스를 포함하도록 강제 적용 할 수 있습니까?전체 인터페이스에 대해 jUnit 테스트 적용

오버로드 된 테스트 메서드를 작성하는 규칙이 있으므로 이름이 일관됩니다 (현재 기술은 methodName + parameter1Type + parameter2Type + ...와 비슷합니다)?

첫 번째 작업을 수행하는 좋은 방법이 있다면 두 번째 질문이 다루어 지거나 피할 수 있기를 바랍니다.


문제점이 몇 가지 인터페이스를 구현하는 클래스가 있습니다. 스프링 주입 서비스 클래스를 테스트하기 때문에 모든 것이 적어도 하나의 인터페이스를가집니다.

public interface MyInterface{ 
    int doFoo(int input); 
    int doBar(int input); 
} 

이 MyInterfaceImpl 말할 수 있습니다,이 인터페이스를 구현합니다

은 어쨌든 내가 구현하는 클래스를 말한다. 지금 위의 크기의 측면에서 나쁜에없는

import static org.junit.Assert.assertEquals; 
import org.junit.Test; 
public class MyInterfaceImplTest{ 
    private MyInterface = new MyInterfaceImpl(); //could inject it... 

    @Test 
    public void doFooTest(){ 
     //content of test not relevant 
    } 

    @Test 
    public void doBarTest(){ 
     //content of test not relevant 
    } 
} 

하지만 내가 더 큰 클래스의 모든 테스트를 적용했는지 알고 어렵다 :

지금 내 테스트 클래스는 같을 것 나는 하나를 놓칠 수 있었다. 또한 오버로드 된 메서드에 대한 메서드 이름을 만들 수 있습니다. 클래스에 기능을 추가 할 수도 있고 놓칠 수도 있습니다. 내가 TDD를하고 있다면 이것은 거의 불가능할 것이지만 나는 여전히 확신하고 싶다. 내가 쓰고 싶은 유혹은 ...

그리고 나서 각 방법 앞에 @Test를 붙이고 싶습니다. 물론 이것은 테스트에 값을 넣어야하기 때문에 작동하지 않습니다.하지만 을 구현하면을 구현하면 IDE가 메서드를 추가하고 전체 인터페이스가 구현되도록합니다. 분명히 나는 ​​테스트에서 인터페이스를 실제로 구현하려고하지 않는다는 것을 알고 있지만, 이렇게 할 수 있다면 개발 속도를 높일 수 있다고 생각한다.

답변

3

내게 이것은 "시행"과 "특정 인터페이스를 포괄하는"의미에 달려 있습니다.

인터페이스 메서드가 특정 "계약"을 의미하는 경우 (예 : java.util.Collection.add()가 수신 콜렉션이 호출의 결과로 수정 된 경우 true를 반환 함), 다음과 같은 구현자가 인터페이스를 사용하면 Contract Test을 만들 수 있습니다.

테스트 대상의 모든 메서드가 특정 테스트 클래스에서 실행되는지 보려면 코드 범위 도구 EMMA 또는 Cobertura에서 테스트를 실행하고 원하는 결과가 나오는지 확인하십시오.

+0

그것은 더 나가의 JUnit의 범위에 포함되지 그래서 내가 무엇을 찾고, 생각하고 있었는데 그 이후입니까? – Quaternion

0

아마도 매개 변수화 된 테스트를 검토해야합니다. 여기가 TestNG과 같을 것이다 것입니다 :

@Test(dataProvider = "dp") 
public testInterface(StrategyInterface si) { 
    // will be invoked twice, one with each implementation 
} 

@DataProvider 
static public Object[][] dp() { 
    return new Object[][] { 
    new Object[] { new Strategy1Impl() }, 
    new Object[] { new Strategy2Impl() }, 
    }; 
}