我知道有一种方法是:

@Test
public void foo() {
   try {
      // execute code that you expect not to throw Exceptions.
   } catch(Exception e) {
      fail("Should not have thrown any exception");
   }
}

还有更干净的方法吗?(可能使用了Junit的@Rule?)


当前回答

JUnit5为此添加了assertAll()方法。

assertAll( () -> foo() )

来源:JUnit 5 API

其他回答

以下是所有检查或未检查的异常都无法通过测试:

@Test
public void testMyCode() {

    try {
        runMyTestCode();
    } catch (Throwable t) {
        throw new Error("fail!");
    }
}

在这个问题上遇到了麻烦,因为我创建了一些泛型方法

@Test
void testSomething() {
   checkGeneric(anComplexObect)
}

在https://newbedev.com/sonarqube-issue-add-at-least-one-assertion-to-this-test-case-for-unit-test-with-assertions中提出了一些注释的东西。

解决方案要简单得多。将“checkGeneric”方法重命名为“assertGeneric”就足够了。

@Test
void testSomething() {
  assertGeneric(anComplexObect)
}

JUnit5为此添加了assertAll()方法。

assertAll( () -> foo() )

来源:JUnit 5 API

我偶然发现这一点是因为SonarQube的规则“squid:S2699”:“向这个测试用例添加至少一个断言。”

我有一个简单的测试,它的唯一目标是不抛出异常。

考虑这段简单的代码:

public class Printer {

    public static void printLine(final String line) {
        System.out.println(line);
    }
}

可以添加什么样的断言来测试这个方法? 当然,您可以尝试捕获它,但这只是代码膨胀。

解决方案来自JUnit本身。

如果没有抛出异常,并且你想显式地说明这种行为,只需添加预期,如下例所示:

@Test(expected = Test.None.class /* no exception expected */)
public void test_printLine() {
    Printer.printLine("line");
}

Test.None.class是预期值的默认值。

如果您导入org.junit.Test。没有,你可以这样写:

@Test(expected = None.class)

你可能会觉得更有可读性。

如果您不幸捕获了代码中的所有错误。 你可以愚蠢地做

class DumpTest {
    Exception ex;
    @Test
    public void testWhatEver() {
        try {
            thisShouldThrowError();
        } catch (Exception e) {
            ex = e;
        }
        assertEquals(null,ex);
    }
}