如何在测试类中测试内部异常?



我正在测试一个类(假设a),其中正在调用另一个类(假设B)的另一个方法。B抛出一个异常,但该方法的catch块只是记录一个错误。我如何断言异常正在内部抛出??任何关于这方面的建议都会有所帮助。

A类:

public class A {
private static Logger logger;
private B b;
public A() {
logger = LoggerFactory.getLogger("A");
b = new B();
}
public void methodA() {
b.methodB();
logger.info("A");
}
}

B类:


public class B {
private static Logger logger;
public B() {
logger = LoggerFactory.getLogger("B");
}
public void methodB() {
try {
throw new Exception("NULL");
} catch(Exception e) {
logger.info("Exception thrown");
}
}
}

测试:

@Test
public void testException() {
A a = new A();
a.methodA();
assertThrows(Exception.class, () -> b.methodB());
}

这是我为测试写的。我收到以下错误:

Expected java.lang.Exception to be thrown, but nothing was thrown.
org.opentest4j.AssertionFailedError: Expected java.lang.Exception to be thrown, but nothing was thrown.

我想确保在代码中抛出一个异常。

类B只是设计得很糟糕,不要这样做。或者,如果你真的想忽略这个错误,那么简单地写一个测试,用try/catch块包装你对B的调用,并使用fail(String)断言方法,如果异常没有被吞下,就导致测试失败。正如你在例子中所写的那样,这应该总是通过的,但我假设在一个更现实的场景中,可能会有疑问。

老实说,不要写像B这样的类!如果出于某种原因你真的绝对不能抛出异常,那么你至少应该返回一个可选的<>或者别的什么,比如拿着一面旗帜,表明是否发生了异常。至少这将是完全可测试的。

最新更新