如何在JUnit中捕获异常

时间:2019-05-28 07:47:52

标签: java exception junit

由于我在catch块中的return语句,因此我的JUnit测试未捕获异常。当我删除返回语句时,测试通过。如果发生异常,我希望我的单元测试可以使用返回语句。

我也尝试了JUnit 5的东西,但不能解决问题。

我的方法:

public ArrayList<Action> parsePlaByPlayTable() {
    ArrayList<Action> actions = new ArrayList<>();
    Document document = null;

    try {
      document = Jsoup.connect(url).get();
    } catch (Exception e) {
      log.error(e.getMessage());
      return new ArrayList<>();
    }

    // if the exception occurs and there is no return in the catch block,
    // nullPointerException is thrown here
    Element table = document.getElementById("pbp"); 

    // more code. . .
}

我的测试:

  @Test(expected = Exception.class)
  public void testParsePlaByPlayTableInvalidUrl() {
    PlayByPlayActionHtmlParser parser = new PlayByPlayActionHtmlParser("https://www.basketbal-reference.com/oxscores/pbp/201905160GS.html");
    ArrayList<Action> actions = parser.parsePlaByPlayTable();
  }

2 个答案:

答案 0 :(得分:4)

因为您要在catch块中吞下该异常并返回一个空列表。检查是否发生异常的唯一方法是断言返回的列表为空。

@Test
public void testParsePlaByPlayTableInvalidUrl() {
    PlayByPlayActionHtmlParser parser = new PlayByPlayActionHtmlParser("https://www.basketbal-reference.com/oxscores/pbp/201905160GS.html");
    ArrayList<Action> actions = parser.parsePlaByPlayTable();
    Assert.assertTrue(actions.isEmpty());
}

您还需要从(expected = Exception.class)批注中删除@Test。因为永远不会抛出异常。

答案 1 :(得分:0)

您正在使用try-catch块捕获异常,因此该抛出将永远不会到达测试方法:您所要做的就是删除try trycatch:

public ArrayList<Action> parsePlaByPlayTable() {
    //...
    document = Jsoup.connect(url).get();
    //...
}

然后您的测试将运行良好,因为@Test(expected = Exception.class)将在测试成功后捕获您的异常