2017-04-03 14 views
9

Tôi hiểu rằng,JUnit @Before vs @Rule

  • @Before@BeforeClass chạy trước mỗi bài kiểm tra, hoặc toàn bộ lớp kiểm tra, tương ứng
  • @Rule@ClassRule quấn mỗi bài kiểm tra, hoặc toàn bộ lớp kiểm tra, tương ứng.

Hãy nói rằng tôi cần phải khởi tạo một số dữ liệu trước mỗi phương pháp kiểm tra,

Làm thế nào để quyết định giữa việc sử dụng @Before@Rule? Dưới những điều kiện nào được ưu tiên hơn một điều kiện khác? Câu hỏi tương tự cũng xảy ra với @BeforeClass so với @ClassRule.

+0

Bản sao có thể được đề xuất http://stackoverflow.com/questions/20295578, nhưng câu hỏi đó không giải quyết khi nào nên sử dụng '@ Rule' và' @ Before' – sam

Trả lời

10

Để sử dụng @Rule, bạn yêu cầu lớp học triển khai TestRule (ưa thích) hoặc MethodRule, như có thể đọc here. Trong khi @Before@After yêu cầu một phương pháp mới được viết trong mọi trường hợp kiểm tra, @Rule không phải vì nó chỉ là một sự khởi tạo của mã đã tồn tại.

Vì vậy, nếu bạn sẽ sử dụng @Before@After cho setUp()tearDown() mà bạn sẽ được sử dụng trong nhiều trường hợp kiểm tra, nó thực sự là một ý tưởng tốt hơn để sử dụng @Rulecode reuse. Nếu bạn có một trường hợp thử nghiệm yêu cầu @Before và/hoặc @After duy nhất thì các chú thích này thích hợp hơn.

Để có câu trả lời phức tạp hơn với một vài ví dụ, hãy xem here. Ajit giải thích nó rất tốt.

3

Thật vậy, như @Quwin đề nghị, accoridng để JUnit 4.12 API doc,

TestRule có thể làm tất cả những gì có thể được thực hiện trước đó với phương pháp chú thích với @Before, @After, @BeforeClass, hoặc @AfterClass, nhưng TestRule s là (1) mạnh mẽ hơn(2) dễ dàng chia sẻ hơn giữa các dự án và các lớp học.


cách mà TestRule s là mạnh hơn:

Có được gọi thực hiện các lớp học của TestRule, đó là một số quy tắc usefuls bạn có thể sử dụng out-of-the-box,

Ví dụ về cách điều này có thể hữu ích, hãy xem các TestRules được cung cấp này hoặc viết của riêng bạn:

  • ErrorCollector: thu thập nhiều sai sót trong phương pháp một thử nghiệm
  • ExpectedException: thực hiện khẳng định linh hoạt về trường hợp ngoại lệ ném
  • ExternalResource: bắt đầu và dừng lại một máy chủ, ví dụ
  • TemporaryFolder: tạo file mới và xóa sau kiểm tra
  • TestName: nhớ tên thử nghiệm để sử dụng trong phương pháp
  • TestWatcher: thêm logic tại sự kiện trong khi phương thức e xecution
  • Timeout: nguyên nhân thử nghiệm thất bại sau một thời gian đặt
  • Verifier: không kiểm tra nếu trạng thái đối tượng kết thúc không chính xác

Một lợi ích của quy tắc, là nhiều quy tắc có thể được sử dụng trong một đơn trường hợp thử nghiệm. Bạn có thể muốn sử dụng RuleChain để chỉ định thứ tự mà các quy tắc sẽ được chạy.

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