2013-07-18 52 views
7

得到關於JUnit的的ExpectedException規則的使用問題:如何使用ExpectedException規則在一個測試中測試多個異常?

由於這裏建議:junit ExpectedException Rule 從開始的JUnit 4.7一個可以測試這樣的例外情況(這是好得多則@Test(預期= Exception.class)) :

@Rule 
public ExpectedException exception = ExpectedException.none(); 

@Test 
public void testFailuresOfClass() { 
Foo foo = new Foo(); 
exception.expect(Exception.class); 
foo.doStuff(); 
} 

現在,我需要一個測試方法測試幾種例外情況和運行下面的測試後,得到了一個綠色條,因此認爲每一個測試通過。

@Test 
public void testFailuresOfClass() { 
Foo foo = new Foo(); 

exception.expect(IndexOutOfBoundsException.class); 
foo.doStuff(); 

//this is not tested anymore and if the first passes everything looks fine 
exception.expect(NullPointerException.class); 
foo.doStuff(null); 

exception.expect(MyOwnException.class); 
foo.doStuff(null,""); 

exception.expect(DomainException.class); 
foo.doOtherStuff(); 
} 

但是一段時間後,我意識到,第一檢查通過後TestMethod的是退出。至少可以說這是不明確的。在junit 3這很容易... 所以這裏是我的問題:

如何使用ExpectedException規則在一個測試中測試幾個異常?

+0

您仍然可以使用Junit 3的方式,但不可能使用@Test(預期)或ExpectedException。 –

+0

我擔心如此;-) – Lonzak

+1

這並不壞。通常最好每個測試都測試一件事情。如果你在同一個測試中測試一個列表,比如說notNull,大小和內容,但是不要在一次測試中測試兩個概念不同的東西,那也沒問題。它的可讀性較差。如果每次測試測試一件事情,您可以使用方法名稱來描述您正在測試的內容,而不是'testException' –

回答

6

簡答:你不行。

如果第一次調用foo.doStuff()引發異常,則永遠不會達到foo.doStuff(null)。你必須建立分類測試分爲幾個(和這個簡單例子中我提出要回簡單的符號,不ExpectedException):

private Foo foo; 

@Before 
public void setUp() { 
foo = new Foo(); 
} 

@Test(expected = IndexOutOfBoundsException.class) 
public void noArgsShouldFail() { 
foo.doStuff(); 
} 

@Test(expected = NullPointerException.class) 
public void nullArgShouldFail() { 
foo.doStuff(null); 
} 

@Test(expected = MyOwnException.class) 
public void nullAndEmptyStringShouldFail() { 
foo.doStuff(null,""); 
} 

@Test(expected = DomainException.class) 
public void doOtherStuffShouldFail() { 
foo.doOtherStuff(); 
} 

如果你真的想要一個且只有一個測試,你可以fail如果沒有引發錯誤,並且抓住你所期望的東西:

@Test 
public void testFailuresOfClass() { 
Foo foo = new Foo(); 

try { 
    foo.doStuff(); 
    fail("doStuff() should not have succeeded"); 
} catch (IndexOutOfBoundsException expected) { 
    // This is what we want. 
} 
try { 
    foo.doStuff(null); 
    fail("doStuff(null) should not have succeeded"); 
} catch (NullPointerException expected) { 
    // This is what we want. 
} 
// etc for other failure modes 
} 

這變得相當混亂蠻快的,但是,如果第一個期望失敗,你不會看到,如果什麼都失敗,那麼,這在排除故障時可能很煩人。

相關問題