Java JUnit4和异常处理

Java JUnit4和异常处理,java,junit,Java,Junit,由于存在无法访问的catch块,以下代码无法编译 我想编写“tues”函数,并在许多其他单元测试函数中调用它 这可能吗?如何实施 private void catchException(boolean condition) { try { assertTrue(condition); } catch (SomeException e) { fail("exception

由于存在无法访问的catch块,以下代码无法编译

我想编写“tues”函数,并在许多其他单元测试函数中调用它

这可能吗?如何实施

private void catchException(boolean condition) {
        try
        {
            assertTrue(condition);
        }
        catch (SomeException e)
        {
            fail("exception = " + e.getMessage());
        }
}

谢谢

通过
Exception
修改
SomeException
将导致代码编译。

您的代码的问题是
assertTrue
不会抛出
SomeException
,如果您用抛出的函数替换它,它将编译。

我不完全确定您在这里要问什么,但是你发布的代码有几处错误

如果try中的代码可能引发与捕获的异常类型相同的异常,则只能为选中的异常创建catch块。由于选中的异常必须在方法的throws子句中声明,因此可以检查正在调用的任何方法是否会抛出正在捕获的异常类型。从JUnit文档中的:

您可以看到它不会抛出任何已检查的异常


此外,在JUnit测试中的catch块中调用
fail()
,实际上并不需要。如果抛出未捕获的异常,单元测试将自动失败。

只需将
抛出的异常
添加到您的测试签名中,如果抛出异常,测试将失败。

在测试方法中捕获异常不需要失败:

public Object methodUnderTest() throws SomeException {
    ...
}

@Test
public void testMethod() throws SomeException() {
      Object obj = methodUnderTest();
      assert...
}

如果
methodUnderTest()
引发了
SomeException
testMethod()
将失败。

实际上并不清楚用代码实现什么。如果您希望在JUnit激发的异常中有一个格式良好的消息,如果您的断言失败,那么考虑以这种方式编写:

assertTrue("Condition should hold because....", conditionToCheck);
这样,如果检查失败,jUnit将打印您提供的消息。我强烈推荐这个,特别是如果你有很多测试,因为它

  • 帮助您快速识别问题
  • 帮助您的团队成员理解您的断言的目的

    • 显然我的问题不清楚

      我有很多单元测试,所有方法都会抛出相同的异常,但错误消息不同。“SomeException”是异常,我必须捕获并读取其中的错误消息

      我想要实现的是编写一个方法,它将是所有单元测试的通用方法,并且可以在其中打印错误消息

      现在单元测试是这样的

       public void test_something()
          {     
              try
              {
                  assertTrue(bw.doSomething("test"));
              }
              catch (SomeException e)
              {
                  fail("exception = " + e.getReason());
              }
          }
      
      public void test_something1()
          {
              IBroadworks bw = getSomehting1();
              try
              {
                  assertTrue(bw.doSomething1("test1"));
              }
              catch (SomeException e)
              {
                  fail("exception = " + e.getReason());
              }
          }
      ...
      
      所以下面的代码在所有单元测试中重复,这是不正确的

      ...
      try{
      assertTrue(condition);
      }
      
      catch (SomeException e)
              {
                  fail("exception = " + e.getReason());
              }
      ...
      

      你到底想达到什么目的?不,不是现在的形式。你想完成什么?什么是“星期二”功能?这与无法到达的捕捉块有什么关系?我一点也不懂这个问题。谢谢你的回答。我知道我应该编写checked exception int catch块,这就是为什么该函数不能工作的原因。我调用fail(),因为如果我不这样做,单元测试通过。@coban22,不,未捕获的异常将导致JUnit测试失败:只需将它添加到测试方法的
      throws
      子句中,这样代码就可以编译了。
      ...
      try{
      assertTrue(condition);
      }
      
      catch (SomeException e)
              {
                  fail("exception = " + e.getReason());
              }
      ...