2011-03-24 248 views
5

當JUnit聲明失敗時,我想做一些「自己的東西」。我想這樣:攔截JUnit聲明函數

public class MyAssert extends org.junit.Assert { 

    // @Override 
    static public void fail(String message) { 
     System.err.println("I am intercepting here!"); 
     org.junit.Assert.fail(message); 
    } 
} 

當然,這不起作用,因爲你不能重載靜態方法。但是,如果它會,這將是很好的,因爲每個斷言功能如assertTrue()調用fail()方法。因此,我可以輕鬆攔截每一個斷言。

是否存在任何方式來做我想在這裏做的事情,而不是實現所有不同口味的assert...

回答

1

您可以編寫一個類,它實現與Assert中所有方法完全相同的簽名,然後委派給Assert方法。

public class MyAssert { 
    static public void assertTrue(String message, boolean condition) { 
     Assert.assertTrue(message, condition); 
    } 

    ... 

    static public void fail(String message) { 
     System.err.println("I am intercepting here!"); 
     Assert.fail(message); 
    } 
} 

不完全重新實現所有的方法,但繁瑣的然而。您的IDE可能能夠幫助生成委託方法。

3

你應該看看Junit 4.7中引入的規則。特別是TestWatchman:

TestWatchman是規則的基類,它記錄了測試操作,但未對其進行修改。例如,這個類將保持一個日誌中的每個通過和未通過測試的:

http://junit-team.github.io/junit/javadoc/4.10/org/junit/rules/TestWatchman.html

它可以讓你定義一個MethodRule可以處理失敗的測試(從javadoc中複製):

@Rule 
    public MethodRule watchman= new TestWatchman() { 
      @Override 
      public void failed(Throwable e, FrameworkMethod method) { 
        watchedLog+= method.getName() + " " + e.getClass().getSimpleName() 
            + "\n"; 
      } 

      @Override 
      public void succeeded(FrameworkMethod method) { 
        watchedLog+= method.getName() + " " + "success!\n"; 
      } 
    }; 

    @Test 
    public void fails() { 
      fail(); 
    } 

    @Test 
    public void succeeds() { 
    } 

按照評論TestWatchman在新版本的Junit中被廢棄,並被TestWatcher取代(但功能相同):

http://junit-team.github.io/junit/javadoc/4.10/org/junit/rules/TestWatcher.html

+2

TestWatchman似乎已被棄用,以支持TestWatcher。 (上面的鏈接被打破) – 2013-08-16 09:13:32

0

對於個人斷言,您可以捕捉AssertionError - 以下作品適合我。當你偶爾需要功能時,它很有用。

try { 
    Assert.assertEquals("size", classes.length, containerList.size()); 
} catch (AssertionError e) { 
    System.err.println("ERROR"); 
    for (AbstractContainer container : containerList) { 
     System.err.println(container.getClass()); 
    } 
    throw (new RuntimeException("Failed", e)); 
}