Причиной неожиданного поведения с использованием механизма ожидаемых исключений JUnit 4? - PullRequest
9 голосов
/ 27 декабря 2008

Я пытаюсь проверить, что конкретный метод вызывает ожидаемое исключение из метода. Согласно документации JUnit4 и этот ответ я написал тест как:

@Test(expected=CannotUndoException.class)  
public void testUndoThrowsCannotUndoException() {   
    // code to initialise 'command'

    command.undo();
}

Однако этот код не проходит тест JUnit, сообщая об исключении (и ожидаемом) как об ошибке.

У метода, который я тестирую, есть только это в теле:

public void undo() {
    throw new CannotUndoException();
}

Кроме того, проходят следующие испытания:

public void testUndoThrowsCannotUndoException() {
    // code to initialise 'command'

    try { 
        command.undo();
        fail();
    } catch (CannotUndoException cue){

    }
}

Это означает, что ожидаемое исключение фактически выдано.

Я на самом деле планирую изменить метод, чтобы он действительно что-то делал, а не просто выбрасывал исключение, но меня заинтересовало, что вызвало проблему, чтобы она не повторилась в будущем.

Были выполнены следующие проверки:

  • Правильное исключение CannotUndoException, импортированное в тестовый пример
  • версия 4 JUnit - единственная на моем пути к классам
  • чистка и сборка рабочего пространства Eclipse не изменили результат

Я использую JUnit 4.1, и в том же тесте я использую Mockito.

Что может быть причиной ошибочного сбоя?

Ответы [ 4 ]

10 голосов
/ 27 декабря 2008

Я нашел проблему.

TestRunner, который я использовал, был правильным (JUnit 4), однако я объявил свой тестовый класс как:

public class CommandTest extends TestCase

Что, как я полагаю, заставляет бегуна тестировать его как тест JUnit 3. Я удалил extends TestCase и получил ожидаемые результаты.

3 голосов
/ 27 декабря 2008

Ваш тестовый код выглядит нормально для меня.

Убедитесь, что вы работаете с тестировщиком junit 4, а не тестировщиком junit 3.8 - это вполне может быть причиной (попробуйте запустить из командной строки или просто визуально осмотрите командную строку при запуске теста). Путь к классу вашего тестируемого может отличаться от пути к классу вашего проекта

Это особенно относится к IDE. В качестве альтернативы вы также можете попробовать перейти на junit 4.4 и посмотреть, решит ли это вашу проблему. (junit 4.5 может вызвать другие проблемы).

1 голос
/ 21 января 2009

У меня была похожая проблема, и я исправил ее, добавив аннотацию

@RunWith(JUnit4ClassRunner.class)

Что говорит тестеру для запуска его с 4er версией Junit

0 голосов
/ 27 декабря 2008

Любопытный.

Я написал три класса:

Команда отмены:

public class UndoCommand
{
    public void undo()
    {
        throw new CannotUndoException();
    }
}

исключение CannotUndoException:

// Note: extends the unchecked superclass RuntimeException
public class CannotUndoException extends RuntimeException
{
    public CannotUndoException()
    {
        super();
    }

    public CannotUndoException(String message)
    {
        super(message);
    }

    public CannotUndoException(String message, Throwable cause)
    {
        super(message, cause);
    }

    public CannotUndoException(Throwable cause)
    {
        super(cause);    
    }
}

И тестовый класс JUnit 4.4:

import org.junit.Test;

public class UndoCommandTest
{
    @Test(expected=CannotUndoException.class)
    public void testUndo()
    {
        UndoCommand command = new UndoCommand();

        command.undo();
    }
}

Работает отлично - все тесты пройдены, "зеленый" результат.

Если я удаляю (ожидается = ...) из аннотации, тест не проходит, как ожидалось.

Я использую Sun JDK 6, JUnit 4.4 и IntelliJ 7.0.5.

Чем ваш отличается?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...