【问题标题】:How can I test raise exception in JUnit5? [duplicate]如何在 JUnit5 中测试引发异常? [复制]
【发布时间】:2026-02-15 08:25:04
【问题描述】:

我想使用JUnit5 测试异常是否正常工作。

例如,假设我测试队列。

public class ArrayCircleQueue {
    .
    .
    .
    public void enQueue(char item) {
        if (isFull()) {
            throw new IndexOutOfBoundsException("Queue is full now!");
        } else {
            itemArray[rear++] = item;
        }
    }
}

测试类

class ArrayCircleQueueTest {
    .
    .
    .
    @org.junit.jupiter.api.Test
    void testEnQueueOverflow() {
        for (int i=0; i<100; i++) {
            queue.enQueue('c');  # test for 10-size queue. It should catch exception
        }
    }
}

我在谷歌搜索它,但只有JUnit4的答案: @Test(expected=NoPermissionException.class)

但它不适用于JUnit5

我该如何处理?

【问题讨论】:

    标签: java junit junit5


    【解决方案1】:
    @Test
    void exceptionTesting() {
        Throwable exception = assertThrows(IllegalArgumentException.class, () -> {
            arrayCircleQueue.enQueue('a') ;
        });
        assertEquals("Queue is full now!", exception.getMessage());
    }
    

    或者你可以试试。

    【讨论】:

      【解决方案2】:

      在 JUnit 5 中,您可以使用 TestExecutionExceptionHandler 的自定义扩展来做类似的事情:

      import org.junit.jupiter.api.extension.TestExecutionExceptionHandler;
      import org.junit.jupiter.api.extension.TestExtensionContext;
      
      public class HandleExtension implements TestExecutionExceptionHandler {
      
          @Override
          public void handleTestExecutionException(TestExtensionContext context,
                  Throwable throwable) throws Throwable {
              // handle exception as you prefer
          }
      
      }
      

      然后在您的测试中,您需要使用ExtendWith 声明该扩展:

      import org.junit.jupiter.api.Test;
      import org.junit.jupiter.api.extension.ExtendWith;
      
      public class ExceptionTest {
      
          @ExtendWith(HandleExtension.class)
          @Test
          public void test() {
              // your test logic
          }
      
      }
      

      【讨论】:

      • 自定义TestExecutionExceptionHandler 确实有效,但只有在您将在整个测试套件中重用逻辑时才有意义。但是,对于一次性情况,assertThrows(...) 是推荐的方法。