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)
và 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 TestWatcher và TestWatchman
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