2016-10-28 50 views
1

注意:MyTest的代碼已更新,以反映我發現的答案,這是由多個實現的assertEquals()在JUnit的生態系統中可用。JUnit似乎沒有調用我的重寫TestWatcher失敗/成功的方法

我在C中看到過類似的問題,但沒有回答/回覆。我已經在實現上左轉,或者忽略了簡單的事情。所以...

我希望看到控制檯上的「IT失敗」和「IT通過」,但沒有喜悅。只是「testFailure()」和「testSuccess()」輸出。

的TestRunner IMPL

import junit.runner.Version; // added to support version check 
import org.junit.runner.JUnitCore; 

public class TestRunner { 
    public static void main(String[] args) { 
     System.out.println(Version.id()); // added to check JUnit version 
     JUnitCore.runClasses(MyTest.class); 
    } 
} 

測試IMPL

// NO LONGER NEDED (v3 -v- v4) import junit.framework.TestCase; 
import org.junit.Rule; 
import org.junit.Test; 
import ort.junit.Assert.assertEquals; // version that invokes TestWatcher 

// public class MyTest extends TestCase { // JUnit v3.X semantics 
public class MyTest {      // JUnit v4.X semantics 

    @Rule 
    public MyTestWatcher myTestWatcher = new MyTestWatcher(); 

    @Test 
    public void testFailure() { 
     System.out.println("testFailure()"); 
     assertEquals("failure", true, false); 
    } 

    @Test 
    public void testSuccess() { 
     System.out.println("testSuccess()"); 
     assertEquals("failure", true, true); 
    } 
} 

TestWatcher IMPL

import org.junit.rules.TestWatcher; 
import org.junit.runner.Description; 

public class MyTestWatcher extends TestWatcher { 

    public MyTestWatcher() {} 

    @Override 
    protected void failed(Throwable e, Description description) { 
     System.out.println("IT FAILED"); 
    } 

    @Override 
    protected void succeeded(Description description) { 
     System.out.println("IT PASSED"); 
    } 
} 
+0

根據Javadoc,你沒有正確使用'TestWatcher':http://junit.org/junit4/javadoc/4.12/org/junit/rules/TestWatcher.html – Tunaki

+0

我只是複製並粘貼,一切正常這裏。嘗試清理舊的jar文件並重建所有內容。 – Paulo

+0

「你沒有正確使用TestWatcher的Javadoc ......」似乎是從「我只是複製和粘貼,一切工作正常......」180。 但是,至少我現在知道代碼應該產生預期的結果,並且可以專注於我的環境副代碼本身。 – SoCal

回答

1

的根本原因是JUnit的V3.X和JUnit 4.x版之間的向後兼容這很好,但它在斷言陳述中注入了一個有趣的超載。

在我最初的代碼中,被調用的方法是org.junit.framework.TestCase.assertEquals()。但是,此版本的assertEquals()似乎不會調用TestWatcher.failed()和TestWatcher.succeeded()。因此,當代碼「成功運行」時,它沒有輸出所需的日誌信息(即「IT FAILED」/「IT PASSED」)。

解決方案是確保assert語句調用正確的實現(即org.junit.Assert中的那些語句)。最簡單的方法是修改測試以符合v4.X語義(即不擴展TestCase),然後添加正確的導入語句。

通過對MyTest的這些修改,現在一切都按預期工作。我已更新了我的原始帖子,以顯示修改的位置。

相關問題