Как я могу использовать JUnit ExpectedException в Scala? - PullRequest
6 голосов
/ 08 сентября 2011

Я бы хотел использовать JUnit 4.7 ExpectedException @ Rule в Scala.Тем не менее, он, похоже, ничего не ловит:

import org.junit._

class ExceptionsHappen {

  @Rule 
  def thrown = rules.ExpectedException.none

  @Test
  def badInt: Unit = {
    thrown.expect(classOf[NumberFormatException])
    Integer.parseInt("one")
  }
}

Это все равно не получается с NumberFormatException.

Ответы [ 5 ]

8 голосов
/ 27 июня 2014

Чтобы это работало с JUnit 4.11 в Scala , вы должны мета-аннотировать свою аннотацию, чтобы аннотация применялась только к (синтетическому) методу-получателю, а не к базовому полю:

import org.junit._
import scala.annotation.meta.getter

class ExceptionsHappen {

  @(Rule @getter)
  def thrown = rules.ExpectedException.none

  @Test
  def badInt: Unit = {
    thrown.expect(classOf[NumberFormatException])
    Integer.parseInt("one")
  }
}
8 голосов
/ 09 сентября 2011

РЕДАКТИРОВАТЬ: После выпуска JUnit 4.11 вы можете аннотировать метод с помощью @Rule.

. Вы будете использовать его следующим образом:

private TemporaryFolder folder = new TemporaryFolder();

@Rule
public TemporaryFolder getFolder() {
    return folder;
}

Для более ранних версий JUnit:см. ответ ниже.

-

Нет, вы не можете использовать это напрямую из Scala.Поле должно быть общедоступным и нестатичным.От org.junit.Rule :

public @interface Rule: Annotates fields that contain rules. Such a field must be public, not static, and a subtype of TestRule.

Вы не можете объявить открытые поля в Scala.Все поля являются частными и доступны для доступа.См. Ответ на этот вопрос .

. Кроме того, уже существует запрос на улучшение для junit (все еще открыт):

Расширение правил для поддержки@Rule public MethodRule someRule () {вернуть новое SomeRule ();}

Другой вариант - разрешить закрытые поля, но это уже было отклонено: Разрешить аннотацию @Rule для закрытых полей .

Итак, вы можете выбрать:

  1. clone junit и реализовать первое предложение, метод и отправить запрос на извлечение
  2. Расширить класс Scala из класса java, который реализует@Rule

-

public class ExpectedExceptionTest {
    @Rule
    public ExpectedException thrown = ExpectedException.none();
}

и последующее наследование от этого:

class ExceptionsHappen extends ExpectedExceptionTest {

  @Test
  def badInt: Unit = {
    thrown.expect(classOf[NumberFormatException])
    Integer.parseInt("one")
  }
}

, который работает правильно.

1 голос
/ 25 августа 2015

Как новичок в Scala, я просто использую очень простой обходной путь: явно перехватываю исключение и терпим неудачу, если ожидаемое исключение не выдается.

Ниже приведен образец скелета:

try {
  *your code that should throw an exception*
  fail("Did not generate *the.Exception.you.expect*")
} catch {
  case t: *the.Exception.you.expect* => // do nothing, it's expected :)
}
0 голосов
/ 22 июня 2012

Если в Scala есть нечто похожее на статический импорт, то catch-exception является альтернативой ExpectedException @ Rule в JUnit 4.7.

0 голосов
/ 09 сентября 2011

Не зная правил JUnit и не тестируя их, потому что у меня нет подходящей настройки под рукой, я выхожу на конечность и предлагаю превратить брошенный в val. Я предполагаю, что это некоторый член, который инициализируется чем-то, а затем он получает какое-то состояние, а затем какой-то другой механизм проверяет состояние против чего-либо. Вы всегда создаете новые и постоянно забываете ожидания.

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