2009-07-30 7 views
6

Tôi có thể có nhiều phương thức với @Parameters trong lớp kiểm tra junit đang chạy với lớp Parameterized không?@parameters in Junit 4

@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; 
} 
} 

Trả lời

2

Bạn có thể sử dụng nhân vật Theories (tìm kiếm các lý thuyết từ tại liên kết đó) để chuyển các tham số khác nhau cho các phương thức khác nhau.

+0

có điều này có thể là giải pháp, Cảm ơn bạn Yishai. – ravinikam

+0

Theo http://blogs.oracle.com/jacobc/entry/junit_theories, bạn không thể ... – dm76

+0

@ dm76, liên kết của bạn dường như cũng làm những gì người hỏi hỏi (nhiều điểm dữ liệu thay thế cho nhiều phương thức tham số), vì vậy tôi là nut hiểu nhận xét của bạn? – Yishai

2

Có lẽ phương pháp data1, nhưng không đảm bảo điều đó, nó sẽ sử dụng bất kỳ cái nào mà JVM cung cấp cho junit4 trước.

Dưới đây là các mã có liên quan từ junit:

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()); 
} 

Vì vậy, công chúng đầu tiên, phương pháp chú thích tĩnh mà nó tìm thấy sẽ được sử dụng, nhưng nó có thể tìm thấy chúng trong bất kỳ thứ tự.

Tại sao bạn có bài kiểm tra bằng văn bản theo cách đó? Bạn chỉ nên có một phương thức @Parameters-đã được báo cáo.

+0

Cảm ơn skaffman. Trên thực tế tôi muốn thử nghiệm hai hành vi khác nhau hợp lệ một và không hợp lệ trong cùng một lớp thử nghiệm với các phương pháp khác nhau. – ravinikam

+0

Ah OK. Nếu bạn quan tâm, bạn có thể viết bản thử nghiệm Á hậu thử nghiệm của riêng bạn (sao chép nguồn cho tham số và sửa đổi nó để tạo của riêng bạn) để làm điều đó, nhưng Á hậu tham số được tích hợp khá thô. – skaffman

+0

hmm, cảm ơn anyways. – ravinikam

2

Nó không được chỉ định có nhiều phương thức dữ liệu. Bạn có thể xem nó trong skaffman's answer.

Tại sao nó không được cung cấp để triển khai hai phương pháp dữ liệu?
Câu trả lời có thể là: Khớp nối.

Quá phức tạp để tách thử nghiệm này thành hai testcases? Bạn sẽ có thể giới thiệu một thừa kế nhỏ và chia sẻ các phương pháp phổ biến. Với hai testcases, bạn có thể cung cấp hai phương thức dữ liệu riêng biệt và kiểm tra nội dung của bạn rất tốt.

Tôi hy vọng điều đó sẽ hữu ích.

+0

đó là quyền nó có thể dễ dàng đạt được bằng cách sử dụng để tách các trường hợp thử nghiệm. Cảm ơn bạn guerda, cho phản ứng của bạn. Trên thực tế tôi đã tìm kiếm cùng một cách mà TestNG sử dụng, cung cấp các nhà cung cấp dữ liệu cho từng phương pháp. – ravinikam

+0

Một upvote sẽ an ủi tôi;) – guerda

1

Bạn có thể tạo các lớp bên trong cho từng bộ phương thức hoạt động trên cùng các tham số. Ví dụ:

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

Điều này đã không làm việc cho tôi, không ai trong số các bài kiểm tra đã chạy. – pts

+0

Bạn phải thêm ['@RunWith (Enclosed.class)'] (http://junit.org/junit4/javadoc/latest/org/junit/experimental/runners/Enclosed.html) vào trước lớp bên ngoài. – sebokopter