2009-07-30 3 views
6

매개 변수화 된 클래스로 실행되는 junit 테스트 클래스에서 @Parameters와 함께 둘 이상의 메소드를 가질 수 있습니까? JVM이 처음 junit4을 제공 중 하나Junit 4의 @parameters

@RunWith(value = Parameterized.class) 
public class JunitTest6 { 

private String str; 

public JunitTest6(String region, String coverageKind, 
     String majorClass, Integer vehicleAge, BigDecimal factor) { 
    this.str = region; 
} 

    @Parameters 
public static Collection<Object[]> data1() { 
    Object[][] data = {{some data}} 

    return Arrays.asList(data); 
} 

@Test 
public void pushTest() { 
    System.out.println("Parameterized str is : " + str); 
    str = null; 
} 

@Parameters 
public static Collection<Object[]> data() { 
    Object[][] data = {{some other data}} 
    return Arrays.asList(data); 
} 

@Test 
public void pullTest() { 
    System.out.println("Parameterized new str is : " + str); 
    str = null; 
} 
} 

답변

2

다른 매개 변수를 다른 방법으로 전달하려면 Theories 러너 (해당 링크에서 단어 이론 검색)를 사용할 수 있습니다.

+0

네, 해결책이 될 수 있습니다, 감사합니다. Yishai. – ravinikam

+0

http://blogs.oracle.com/jacobc/entry/junit_theories에 따르면, 당신은 할 수 없습니다 ... – dm76

+0

@ dm76, 귀하의 링크는 질문자가 요청한 것을 수행하는 것으로 보입니다 (여러 데이터 포인트가 여러 매개 변수 방법 대신 사용됩니다).), 그래서 너의 의견을 이해하는 너트 야? – Yishai

2

아마 data1 방법,하지만 전혀 보장, 그것은 사용할 것이다.

private FrameworkMethod getParametersMethod(TestClass testClass) throws Exception { 
    List<FrameworkMethod> methods= testClass.getAnnotatedMethods(Parameters.class); 
    for (FrameworkMethod each : methods) { 
     int modifiers= each.getMethod().getModifiers(); 
      if (Modifier.isStatic(modifiers) && Modifier.isPublic(modifiers)) 
       return each; 
    } 

    throw new Exception("No public static parameters method on class " + testClass.getName()); 
} 

그래서 찾은 첫 공개, 정적 주석 방법이 사용되지만, 그것은 어떤 순서로 찾을 수 있습니다 :

는 다음의 JUnit에서 관련 코드입니다.

왜 그런 식으로 작성된 테스트가 있습니까? 단 하나의 방법 만 사용하면됩니다 (@Parameters).

+0

skaffman. 감사합니다. 실제로 나는 다른 방법으로 같은 테스트 클래스에서 두 가지 다른 동작이 유효 한 테스트와 잘못된 테스트를 원했습니다. – ravinikam

+0

아 좋아. 만약 당신이 열정적이라면, 자신 만의 Test Runner 구현을 작성할 수 있습니다 (매개 변수화 된 소스를 복사하고 직접 수정할 수 있음). 그러나 내장 된 매개 변수화 된 러너는 매우 조잡합니다. – skaffman

+0

흠, 고마워. – ravinikam

2

하나 이상의 데이터 방법을 지정하지 않았습니다. skaffman's answer에서 확인할 수 있습니다.

왜 두 가지 데이터 메소드를 구현하지 않습니까?
답변은 다음과 같습니다. 커플 링.

이 테스트를 두 개의 테스트 케이스로 나누기에는 너무 복잡합니까? 작은 상속을 도입하고 일반적인 방법을 공유 할 수 있습니다. 두 개의 테스트 케이스를 사용하면 두 개의 분리 된 데이터 메소드를 제공하고 물건을 잘 테스트 할 수 있습니다.

도움이되기를 바랍니다.

+0

테스트 케이스를 분리하여 쉽게 얻을 수 있습니다. 답변 해 주셔서 감사합니다. 실제로 나는 TestNG가 사용하는 것과 동일한 방법을 찾고 있었으며, 각 메소드에 데이터 제공자를 제공했습니다. – ravinikam

+0

upvote는 나를 위로 할 것입니다;) – guerda

1

동일한 매개 변수에서 작동하는 각 메서드 집합에 대해 내부 클래스를 만들 수 있습니다. 예 :

public class JunitTest6 { 

@RunWith(value = Parameterized.class) 
public static class PushTest{ 
    private String str; 
    public PushTest(String region) { 
    this.str = region; 
    } 

    @Parameters 
    public static Collection<Object[]> data() { 
    Object[][] data = {{some data}} 

    return Arrays.asList(data); 
    } 

    @Test 
    public void pushTest() { 
    System.out.println("Parameterized str is : " + str); 
    str = null; 
    } 
} 

@RunWith(value = Parameterized.class) 
public static class PullTest{ 
    private String str; 
    public PullTest(String region) { 
    this.str = region; 
    } 

    @Parameters 
    public static Collection<Object[]> data() { 
    Object[][] data = {{some other data}} 
    return Arrays.asList(data); 
    } 

    @Test 
    public void pullTest() { 
    System.out.println("Parameterized new str is : " + str); 
    str = null; 
    } 
} 
} 
+0

이것은 나에게 효과가 없었으며 아무런 테스트도 실행되지 않았습니다. – pts

+0

외부 클래스 앞에 ['@RunWith (Enclosed.class)'] (http://junit.org/junit4/javadoc/latest/org/junit/experimental/runners/Enclosed.html)를 추가해야합니다. – sebokopter