Утверждение в JUnit внутри Catch Block Без использования тестовых аннотаций [дубликат]

Самое простое решение - создать функцию JavaScript и вызвать его для обратного вызова Ajax success.

function callServerAsync(){
    $.ajax({
        url: '...',
        success: function(response) {

            successCallback(response);
        }
    });
}

function successCallback(responseObj){
    // Do something like read the response and show data
    alert(JSON.stringify(responseObj)); // Only applicable to JSON response
}

function foo(callback) {

    $.ajax({
        url: '...',
        success: function(response) {
           return callback(null, response);
        }
    });
}

var result = foo(function(err, result){
          if (!err)
           console.log(result);    
}); 
217
задан ROMANIA_engineer 13 May 2015 в 07:25
поделиться

8 ответов

Вы можете использовать аннотацию @Rule с ExpectedException , например:

@Rule
public ExpectedException expectedEx = ExpectedException.none();

@Test
public void shouldThrowRuntimeExceptionWhenEmployeeIDisNull() throws Exception {
    expectedEx.expect(RuntimeException.class);
    expectedEx.expectMessage("Employee ID is null");
    // do something that should throw the exception...
}

Обратите внимание, что пример в ExpectedException docs (в настоящее время) неправильный - нет никакого открытого конструктора, поэтому вы должны использовать ExpectedException.none().

384
ответ дан Landei 28 August 2018 в 04:43
поделиться

Мне нравится ответ user64141, но обнаружил, что он может быть более обобщенным. Вот мое взятие:

public abstract class ExpectedThrowableAsserter implements Runnable {

    private final Class<? extends Throwable> throwableClass;
    private final String expectedExceptionMessage;

    protected ExpectedThrowableAsserter(Class<? extends Throwable> throwableClass, String expectedExceptionMessage) {
        this.throwableClass = throwableClass;
        this.expectedExceptionMessage = expectedExceptionMessage;
    }

    public final void run() {
        try {
            expectException();
        } catch (Throwable e) {
            assertTrue(String.format("Caught unexpected %s", e.getClass().getSimpleName()), throwableClass.isInstance(e));
            assertEquals(String.format("%s caught, but unexpected message", throwableClass.getSimpleName()), expectedExceptionMessage, e.getMessage());
            return;
        }
        fail(String.format("Expected %s, but no exception was thrown.", throwableClass.getSimpleName()));
    }

    protected abstract void expectException();

}

Обратите внимание, что при выходе из инструкции «fail» в блоке try блокируется связанное исключение исключения; использование return в операторе catch предотвращает это.

1
ответ дан Addison Crump 28 August 2018 в 04:43
поделиться

Вам нужно использовать @Test(expected=SomeException.class)? Когда мы должны утверждать фактическое сообщение исключения, это то, что мы делаем.

@Test
public void myTestMethod()
{
  try
  {
    final Integer employeeId = null;
    new Employee(employeeId);
    fail("Should have thrown SomeException but did not!");
  }
  catch( final SomeException e )
  {
    final String msg = "Employee ID is null";
    assertEquals(msg, e.getMessage());
  }
}
26
ответ дан ashes999 28 August 2018 в 04:43
поделиться

Мне нравится ответ @Rule . Однако, если по какой-то причине вы не хотите использовать правила. Существует третий вариант.

@Test (expected = RuntimeException.class)
public void myTestMethod()
{
   try
   {
      //Run exception throwing operation here
   }
   catch(RuntimeException re)
   {
      String message = "Employee ID is null";
      assertEquals(message, re.getMessage());
      throw re;
    }
    fail("Employee Id Null exception did not throw!");
  }
29
ответ дан Community 28 August 2018 в 04:43
поделиться

При использовании @Rule набор исключений применяется ко всем методам тестирования в классе Test.

3
ответ дан Jyothi 28 August 2018 в 04:43
поделиться

На самом деле лучше всего использовать try / catch. Зачем? Потому что вы можете контролировать место, где вы ожидаете исключения.

Рассмотрим этот пример:

@Test (expected = RuntimeException.class)
public void someTest() {
   // test preparation
   // actual test
}

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

Вот почему гораздо лучше использовать try / catch, чем полагаться на аннотацию.

7
ответ дан Krzysztof Cislo 28 August 2018 в 04:43
поделиться

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

Добавьте этот класс утилиты:

import org.junit.Assert;

public abstract class ExpectedRuntimeExceptionAsserter {

    private String expectedExceptionMessage;

    public ExpectedRuntimeExceptionAsserter(String expectedExceptionMessage) {
        this.expectedExceptionMessage = expectedExceptionMessage;
    }

    public final void run(){
        try{
            expectException();
            Assert.fail(String.format("Expected a RuntimeException '%s'", expectedExceptionMessage));
        } catch (RuntimeException e){
            Assert.assertEquals("RuntimeException caught, but unexpected message", expectedExceptionMessage, e.getMessage());
        }
    }

    protected abstract void expectException();

}

Тогда для моего модульного теста мне нужен только этот код:

@Test
public void verifyAnonymousUserCantAccessPrivilegedResourceTest(){
    new ExpectedRuntimeExceptionAsserter("anonymous user can't access privileged resource"){
        @Override
        protected void expectException() {
            throw new RuntimeException("anonymous user can't access privileged resource");
        }
    }.run(); //passes test; expected exception is caught, and this @Test returns normally as "Passed"
}
6
ответ дан user64141 28 August 2018 в 04:43
поделиться

Импортируйте библиотеку catch-exception и используйте это. Это намного чище, чем правило ExpectedException или try-catch.

Пример формы их документов:

import static com.googlecode.catchexception.CatchException.*;
import static com.googlecode.catchexception.apis.CatchExceptionHamcrestMatchers.*;

// given: an empty list
List myList = new ArrayList();

// when: we try to get the first element of the list
catchException(myList).get(1);

// then: we expect an IndexOutOfBoundsException with message "Index: 1, Size: 0"
assertThat(caughtException(),
  allOf(
    instanceOf(IndexOutOfBoundsException.class),
    hasMessage("Index: 1, Size: 0"),
    hasNoCause()
  )
);
0
ответ дан whistling_marmot 28 August 2018 в 04:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: