我知道完成它的一种方法是:
@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
注解?)
我知道完成它的一种方法是:
@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
注解?)
@Test
fun `Should not throw`() {
whenever(authService.isAdmin()).thenReturn(true)
assertDoesNotThrow {
service.throwIfNotAllowed("client")
}
}
import org.assertj.core.api.Assertions;
import org.junit.Test;
public class AssertionExample {
@Test
public void testNoException(){
assertNoException();
}
private void assertException(){
Assertions.assertThatThrownBy(this::doNotThrowException).isInstanceOf(Exception.class);
}
private void assertNoException(){
Assertions.assertThatThrownBy(() -> assertException()).isInstanceOf(AssertionError.class);
}
private void doNotThrowException(){
//This method will never throw exception
}
}
@Test
public void foo() {
try {
//execute code that you expect not to throw Exceptions.
} catch (Exception e){
assertNull(e);
}
}
catch
块永远不会被执行,所以assertNull
也不会被执行。然而,快速阅读者会产生一种印象,即一个断言被作出,真正验证了非抛出情况。换句话说:如果catch
块被执行,则异常始终为非null - 因此可以用简单的fail
替换它。 - AndreasassertNull(e)
会将测试报告为失败,因为在catch
块中已经声明e
不能为null
...Mike这只是奇怪的编程 :-/ ...是的,至少像Andreas说的那样使用fail()
。 - Julien你可以基于junit的断言创建任何类型的自定义断言,因为它们专门设计用于创建用户定义的断言,旨在与junit的断言完全相同:
static void assertDoesNotThrow(Executable executable) {
assertDoesNotThrow(executable, "must not throw");
}
static void assertDoesNotThrow(Executable executable, String message) {
try {
executable.execute();
} catch (Throwable err) {
fail(message);
}
}
现在正在测试所谓的场景methodMustNotThrow,并以junit风格记录所有失败:
//test and log with default and custom messages
//the following will succeed
assertDoesNotThrow(()->methodMustNotThrow(1));
assertDoesNotThrow(()->methodMustNotThrow(1), "custom facepalm");
//the following will fail
assertDoesNotThrow(()->methodMustNotThrow(2));
assertDoesNotThrow(()-> {throw new Exception("Hello world");}, "message");
//See implementation of methodMustNotThrow below
一般来说,在任何情况下,通过调用fail(someMessage)
可以立即使测试失败,无论在何处都是有可能的,只要它有意义。这个方法就是为了这个目的而设计的。例如,在try/catch块中使用它,以便在测试用例中抛出任何异常时失败:
try{methodMustNotThrow(1);}catch(Throwable e){fail("must not throw");}
try{methodMustNotThrow(1);}catch(Throwable e){Assertions.fail("must not throw");}
这是我们测试方法的示例,假设我们有这样一个方法,在特定情况下必须不会失败,但它可能会失败:
void methodMustNotThrow(int x) throws Exception {
if (x == 1) return;
throw new Exception();
}
上述方法是一个简单的示例。但这适用于复杂情况,其中故障不太明显。 以下是导入:
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.function.Executable;
import static org.junit.jupiter.api.Assertions.*;
有相当更好的选项来检查这个断言
。我发现JUnit 5中的断言与我之前版本中的相当相似,而之前的版本中并没有这个断言。所以,你是在说JUnit 5重新发明了轮子,并引入了一个相当更糟的选项来检查这个断言吗?还要记住,我确切地使用了专门为此目的设计的JUnit功能,这个功能是为开发人员提供一种创建自己断言的方式。 - undefined@Test
public void consumesAndLogsExceptions() throws Exception {
context.checking(new Expectations() {
{
oneOf(collaborator).doSth();
will(throwException(new NullPointerException()));
}
});
target.doSth();
}
如果您的目标确实消耗了抛出的异常,测试将通过,否则测试将失败。
如果您想测试异常消耗逻辑,则情况会变得更加复杂。我建议将消耗委托给一个可以模拟的协作者。因此测试可以是:
@Test
public void consumesAndLogsExceptions() throws Exception {
Exception e = new NullPointerException();
context.checking(new Expectations() {
{
allowing(collaborator).doSth();
will(throwException(e));
oneOf(consumer).consume(e);
}
});
target.doSth();
}
但有时候如果你只想记录日志,它可能过于设计复杂了。在这种情况下,如果您坚持进行TDD,则可以参考这篇文章(http://java.dzone.com/articles/monitoring-declarative-transac, http://blog.novoj.net/2008/09/20/testing-aspect-pointcuts-is-there-an-easy-way/)。
我遇到了同样的情况,我需要检查异常在应该抛出时是否被抛出,而且只有在应该抛出时才抛出。最终我利用异常处理程序编写了以下代码:
try {
functionThatMightThrowException()
}catch (Exception e){
Assert.fail("should not throw exception");
}
RestOfAssertions();
我在编写一些通用方法时遇到了这个问题
@Test
void testSomething() {
checkGeneric(anComplexObect)
}
@Test
void testSomething() {
assertGeneric(anComplexObect)
}
private val
是什么编程语言?显然不是Java ;p请不要提供代码截图,这是不受欢迎的。 - Andremoniy@Rule
public ExpectedException expectedException = ExpectedException.none();
以下代码无法通过所有异常测试,包括已检查和未检查的异常:
@Test
public void testMyCode() {
try {
runMyTestCode();
} catch (Throwable t) {
throw new Error("fail!");
}
}