2017-04-16 53 views
1

我有以下類:JUnit 4中ExpectedException.expectMessage應該失敗的考驗,它不

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

@Test 
public void testMyMethod() throws Exception { 
    // Test 1 
    String[] args = ...; 
    MyClass.myMethod(args); 

    // Test 2 
    thrown.expect(InvalidParamException.class); 
    thrown.expectMessage("exceptionString 1"); 
    args = ...; 
    MyClass.myMethod(args); 

    // test 3 
    thrown.expect(InvalidParamException.class); 
    thrown.expectMessage("exceptionString 2"); 
    args = ...; 
    MyClass.myMethod(args); 
} 

的問題是,在expectMessage測試2是假的,爲了討論的實際着想預期的消息是exceptionString 3,但測試不會失敗,但預期消息與實際消息不同。 它得到怪異 - 如果我提供expectMessage一亂碼消息,如「fdsfsdfsdfsdfsdfsdthe」 - 那麼測試失敗並:

java.lang.AssertionError: 預期:(InvalidParamException的實例,並與異常消息包含字符串「fdsfsdfsdfsdfsdfsdthe」) 但:有消息除了包含字符串「fdsfsdfsdfsdfsdfsdthe」消息是「exceptionMessage3」

這就是預期的行爲 - 但是當我改變exceptionMessage3只是一點點,或前兩個字母,甚至發送空字符串 - 測試不會失敗。

我錯過了什麼嗎?

+2

'ExpectedException'只保留1個預期的異常。你不能像這樣重複使用它。 –

回答

4

ExpectedException只保留1個預期的例外。

你不能像這樣重複使用它。或者:

  1. 將測試用例分成3個獨立的測試用例;
  2. 有3 ExpectedException個實例;
  3. 使用普通舊try/catch;
  4. 使用assertThrows(或expectThrows)如果您使用的是最新版本的Java(8+)和支持它的JUnit。
+0

我去了第一個,就是它 – SockworkOrange

+1

@SockworkOrange我懷疑你現在的意思是第二;我剛剛編輯添加一個新的第一。 –