2012-10-18 32 views
14

org.junit.rules.MethodRule và org.junit.rules.TestWatchman đã không được chấp nhận.tại sao JUnit MethodRule và TestWatchman không được chấp nhận?

một lưu ý thú vị là tại địa chỉ: https://github.com/junit-team/junit/pull/519, một phần: "Nhiều nhà phát triển là lý do chính đáng để gắn bó với MethodRule và đội JUnit không có kế hoạch để loại bỏ hỗ trợ cho MethodRule ..."

http://junit-team.github.io/junit/javadoc/4.10/org/junit/rules/TestWatchman.html tài liệu: "Không được chấp nhận. MethodRule không được chấp nhận. Sử dụng TestWatcher thực hiện TestRule thay thế." và cung cấp một số mã ví dụ.

Lý do đằng sau việc đánh dấu những điều này không được chấp nhận là gì? Sự cân bằng giữa TestWatcher và TestWachman không được chấp nhận là gì? Bạn có liên kết tốt cho bản tóm tắt hoặc tổng quan về chủ đề cụ thể này không?

+1

Theo ghi chú phát hành cho phiên bản 4.11 của JUnit: "MethodRule không còn phản đối." Xem https://github.com/KentBeck/junit/blob/master/doc/ReleaseNotes4.11.md – sversch

Trả lời

19

Lý do rất đơn giản, TestRule được lên kế hoạch để thay thế MethodRule. MethodRule đã được giới thiệu thực hiện trong 4.7, và nó là một giao diện với một phương pháp:

Statement apply(Statement base, FrameworkMethod method, Object target) 

FrameworkMethod là (hầu như) một lớp JUnit nội bộ, mà không nên được tiếp xúc ở nơi đầu tiên. object là đối tượng mà phương thức sẽ được chạy, ví dụ, bạn có thể sửa đổi trạng thái của phép thử bằng cách sử dụng sự phản chiếu.

TestRule được giới thiệu vào 4.9, tuy nhiên, là:

Statement apply(Statement base, Description description) 

Description là một POJO bất biến có chứa các mô tả về thử nghiệm. Cách sửa đổi trạng thái trong một bài kiểm tra là đóng gói chính xác trong bài kiểm tra bằng cách sử dụng TestRule. Đó là một thiết kế hoàn toàn sạch hơn.

Sự khác biệt cụ thể giữa TestWatchman(MethodRule)TestWatcher(TestRule) là tối thiểu, ngoại trừ việc TestWatcher có xử lý lỗi tốt hơn, vì vậy điều này nên được sử dụng tùy chọn. Cả hai đều có phương pháp có thể ghi đè như succeeded(), failed(), starting(), finished().

public static class WatchmanTest { 
    private static String watchedLog; 

    @Rule 
    public TestWatcher watchman= new TestWatcher() { 
    @Override 
    protected void failed(Throwable e, Description description) { 
     watchedLog+= description + "\n"; 
    } 

    @Override 
    protected void succeeded(Description description) { 
     watchedLog+= description + " " + "success!\n"; 
    } 
    }; 

    @Test 
    public void fails() { 
    fail(); 
    } 

    @Test 
    public void succeeds() { 
    } 
} 

TestWatcher(TestRule) xử lý ngoại lệ trong các phương pháp overidden. Nếu ngoại lệ được ném, thì phương pháp thử sẽ không thành công sau khi thực hiện phép thử, thay vì trong quá trình thực thi.

Để biết thêm thông tin, xem TestWatcherTestWatchman

+1

vậy tại sao MethodRule không còn được dùng nữa trong JUnit 4.11? – BrunoJCM

+1

Nó không được chấp nhận vì nó vẫn có một số trường hợp sử dụng: xem https://github.com/junit-team/junit/pull/519 –

Các vấn đề liên quan