2011-09-08 34 views
6

Tôi muốn có thể sử dụng số ExpectedException @Rule của JUnit 4.7 trong Scala. Tuy nhiên, dường như không bắt được bất cứ điều gì:Làm cách nào để sử dụng JUnit ExpectedException trong Scala?

import org.junit._ 

class ExceptionsHappen { 

    @Rule 
    def thrown = rules.ExpectedException.none 

    @Test 
    def badInt: Unit = { 
    thrown.expect(classOf[NumberFormatException]) 
    Integer.parseInt("one") 
    } 
} 

Điều này vẫn không thành công với NumberFormatException.

Trả lời

7

EDIT: Sau khi phát hành JUnit 4.11, bây giờ bạn có thể chú thích một phương thức với @Rule.

Bạn sẽ sử dụng nó như:

private TemporaryFolder folder = new TemporaryFolder(); 

@Rule 
public TemporaryFolder getFolder() { 
    return folder; 
} 

Đối với phiên bản trước của JUnit, xem câu trả lời dưới đây.

-

Không, bạn không thể sử dụng trực tiếp từ Scala. Trường cần phải công khai và không tĩnh. Từ org.junit.Rule:

public @interface Rule: Annotates fields that contain rules. Such a field must be public, not static, and a subtype of TestRule.

Bạn không thể tuyên bố một lĩnh vực nào trong Scala. Tất cả các trường là riêng tư và có thể truy cập được bởi người truy cập. Xem câu trả lời cho số này question.

Cũng vì điều này, đã có một yêu cầu tăng cường cho junit (vẫn mở):

Extend rules to support @Rule public MethodRule someRule() { return new SomeRule(); }

Các tùy chọn khác là nó lĩnh vực ngoài công lập được phép, nhưng điều này đã bị từ chối : Allow @Rule annotation on non-public fields.

Vì vậy, lựa chọn của bạn là:

  1. bản sao junit, và thực hiện các đề nghị đầu tiên, phương pháp, và gửi một yêu cầu kéo
  2. Mở rộng lớp Scala từ một lớp java mà thực hiện các @Rule

-

public class ExpectedExceptionTest { 
    @Rule 
    public ExpectedException thrown = ExpectedException.none(); 
} 

và sau đó kế thừa từ rằng:

class ExceptionsHappen extends ExpectedExceptionTest { 

    @Test 
    def badInt: Unit = { 
    thrown.expect(classOf[NumberFormatException]) 
    Integer.parseInt("one") 
    } 
} 

hoạt động chính xác.

+1

Để rõ ràng: nó (bây giờ) hoạt động trên scala (nhưng chỉ với phương pháp: '@Rule def myRule = ...' và không có thuộc tính như '@ Quy tắc val myRule = ... ') –

0

Không biết quy tắc JUnit và không thử nghiệm, vì tôi không có thiết lập phù hợp, tôi đi ra ngoài và đề nghị quay thành val. Tôi đoán một số thành viên của nó được khởi tạo với một cái gì đó và sau đó nó được một số nhà nước và sau đó một số máy móc khác kiểm tra nhà nước chống lại một cái gì đó. Bạn luôn tạo ra những cái mới và giữ quên sự mong đợi.

0

Nếu Scala có thứ gì đó tương tự như nhập tĩnh, thì catch-exception là một thay thế cho ExpectedException @Rule của JUnit 4.7.

6

Để thực hiện công việc này với JUnit 4.11 trong Scala, bạn nên Meta-chú thích chú thích của mình để các chú thích chỉ được áp dụng cho (tổng hợp) phương thức getter, không phải là lĩnh vực tiềm ẩn:

import org.junit._ 
import scala.annotation.meta.getter 

class ExceptionsHappen { 

    @(Rule @getter) 
    def thrown = rules.ExpectedException.none 

    @Test 
    def badInt: Unit = { 
    thrown.expect(classOf[NumberFormatException]) 
    Integer.parseInt("one") 
    } 
} 
0

Là một newbie rất để Scala tôi chỉ sử dụng một cách giải quyết rất đơn giản: nắm bắt rõ ràng ngoại lệ và thất bại nếu ngoại lệ dự kiến ​​của bạn không được ném.

Dưới đây là một bộ xương mẫu:

try { 
    *your code that should throw an exception* 
    fail("Did not generate *the.Exception.you.expect*") 
} catch { 
    case t: *the.Exception.you.expect* => // do nothing, it's expected :) 
} 
Các vấn đề liên quan