JUnit, кажется, не вызывает мои переопределенные методы TestWatcher с ошибками / успешно

Примечание: код для MyTest был обновлен, чтобы отразить ответ, который я нашел, что вызвано множеством реализаций assertEquals(), доступных в экосистеме JUnit.

Я видел подобный вопрос в C, но нет ответа / ответов. Я либо повернул налево к реализации, либо пропускаю что-то простое. Так...

Я ожидал увидеть "ЭТО НЕ УДАЛЕНО" и "ЭТО ПРОЙДЕНО" на консоли, но радости нет. Просто вывод "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);
    }
}

Тест импл

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

1 ответ

Решение

Основной причиной является обратная совместимость между JUnit v3.X и JUnit v4.X. Это хорошо, но это внесло интересную перегрузку в утверждения утверждения.

В моем исходном коде был вызван метод org.junit.framework.TestCase.assertEquals(). Однако эта версия assertEquals (), по-видимому, не вызывает TestWatcher.failed() и TestWatcher.succeeded(). Таким образом, хотя код "успешно выполнен", он не выдал нужную информацию о регистрации (то есть "СБОЙ"/"ПРОЙДЕНО").

Решением было убедиться, что операторы assert вызывают правильную реализацию (т. Е. Те, что в org.junit.Assert). Самый простой способ сделать это - изменить тест, чтобы он соответствовал семантике v4.X (т.е. не расширять TestCase), а затем добавить правильный оператор импорта.

С этими изменениями в MyTest все теперь работает как положено. Я обновил свой оригинальный пост, чтобы показать, где были сделаны изменения.

Другие вопросы по тегам