2011-04-05 3 views
27

я получил следующий тест:JUnit @Test ожидается аннотаций не работает

@Test(expected = IllegalStateException.class) 
public void testKey() { 
    int key = 1; 
    this.finder(key); 
} 

Но отчеты JUnit, что тест не пройден, хотя он бросает - как и ожидалось - в IllegalStateException.

Должен ли я настроить что-то еще, чтобы этот запуск выполнялся?


Я запустить тест сейчас с

@RunWith(Suite.class) 
@SuiteClasses(Test.class) 
public class TestSuite { 

} 

как в this question, но я до сих пор не получают желаемого результата.

И когда я удаляю префикс test, я все еще получаю сообщение об ошибке.

Должен сказать, что я запускаю эти тесты с помощью Eclipse, но он настроен на использование JUnit 4 Runner.

+5

Возможно, вы случайно проводите тест с JUnit 3. Увеличивает ли тестовый класс TestCase? Что происходит, когда вы меняете имя метода тестирования, чтобы оно больше не начиналось с 'test'? –

+0

Когда имя теста не начинается с 'test', я получаю сообщение' junit.framework.AssertionFailedError: тестов нет в MyClass' –

+0

И да, класс расширяет 'TestCase'. –

ответ

45

Проблема заключалась в том, что класс, в который был вложен тест, был расширением TestCase. Поскольку это стиль JUnit 3, аннотация не работает.

Теперь мой тестовый класс является классом самостоятельно.

2

Это выглядит правильно для меня.

Проверьте свои предположения. Вы уверены, что ли это исключение? Если то, что вы говорите, верно, удаление ожидаемого из аннотации должно привести к сбою.

Я бы прошел через код с помощью отладчика, чтобы узнать, что происходит. Я предполагаю, что у вас есть IDE, которая сделает это, например IntelliJ.

3

Нет, этот тест JUnit должен работать так, как есть - на этой стороне больше ничего не нужно.

Что вы уверены, что тест бросает IllegalStateException? Возможно ли, что оно завернуто в другое исключение другого типа?

Пожалуйста, сообщите точное сообщение об ошибке от JUnit.

Как было предложено @duffymo, легко проверить, что (если есть) исключение, которое действительно бросает испытание.

+0

Сообщение JUnit: 'java.lang.IllegalStateException: ... MyErrorMessage ..' –

+0

Да, исключение может быть обернуто в другое, но в этом случае вы должны утверждать _wrapper_ one, и никогда другого. – Powerslave

1

Просто протестировано это под JUnit4: эта работа DO, тест завершается успешно. Посмотрите, является ли это IllegalSelectorException или такой.

6

Я пробовал этот и работал отлично, как ожидалось.

public class SampleClassTest { 
@Test(expected = ArithmeticException.class) 
public void lost(){ 
this.lost(0); 
} 
private void lost(int i) throws ArithmeticException { 
System.out.println(3/i); 
} 
} 

также гарантировать, что junit4 добавляются в зависимости, @ (аннотации) являются новой функцией в JUnit 4.

4

я столкнулся с аналогичной проблемой, решение простое «Не распространяется TestCase класса»

7
@RunWith(JUnit4.class) 
public class MyTestCaseBase extends TestCase 

У меня также были проблемы с @Test (ожидается = ...), когда я расширил класс TestCase в своем базовом тесте. Использование @RunWith (JUnit4.class) помогло мгновенно (не очень элегантное решение, я признаю)

+0

Вам больше не нужно расширять TestCase с помощью JUnit4 +. –

0

У меня была та же проблема, что я только что изменил свои операторы импорта. я снял:

import org.junit.jupiter.api.Test; 

import junit.framework.TestCase; 

и добавил:

import org.junit.Test; 

И это работало нормально для меня.