2016-10-28 6 views
1

注:JUnitのエコシステムで複数のassertEquals()を実装しているため、MyTestのコードが更新されました。 。JUnitは、オーバーライドされたTestWatcherの失敗/成功メソッドを呼び出すようではありません

私はCで同様の質問を見ましたが、回答/応答はありませんでした。私は実装を左に回したか、単純なものを見落としています。だから...

私はコンソールに "IT FAILED"と "IT PASSED"が見えると思うが、喜びはない。単に "testFailure()"と "testSuccess()"の出力。

テストランナーの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

+0

Javadocで 'TestWatcher'を正しく使用していません:http://junit.org/junit4/javadoc/4.12/org/junit/rules/TestWatcher.html – Tunaki

+0

私はちょうどコピーして貼り付け、すべて正常に動作します。ここに。 olds jarファイルをきれいにして、すべてを再構築してみてください。 – Paulo

+0

"JavadocによるとTestWatcherを正しく使用していません..."は "私はちょうどコピーして貼り付けて、すべてうまくいきます..."と思われます。 しかし、少なくとも私はコードが期待される結果を生み出すべきであることを知り、コード自身の環境にも集中することができます。 – SoCal

答えて

1
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"); 
    } 
} 

根本的な原因は、JUnitのV3.XとJUnit v4.X.間の下位互換性がありますいいですが、それはアサーションステートメントに面白いオーバーロードを注入しました。

私の元のコードでは、呼び出されるメソッドはorg.junit.framework.TestCase.assertEquals()でした。ただし、このバージョンのassertEquals()ではTestWatcher.failed()およびTestWatcher.succeeded()が呼び出されていないようです。そのため、コードは「正常に実行されました」が、目的のログ情報(「IT FAILED/IT PASSED」)を出力しませんでした。

解決策は、アサート・ステートメントが正しい実装(つまり、org.junit.Assert内のもの)を呼び出すことを確認することでした。これを行う最も簡単な方法は、v4.Xセマンティクス(TestCaseを拡張しない)に準拠するようにテストを変更し、正しいimport文を追加することでした。

これらのMyTestの変更により、すべてが現在正常に動作します。オリジナルの投稿を更新して、変更箇所を表示しました。

関連する問題