blob: 5238db6275b924726babdd474f04a459bfcae3a1 [file]
/*
* Copyright 2015-2022 the original author or authors.
*
* All rights reserved. This program and the accompanying materials are
* made available under the terms of the Eclipse Public License v2.0 which
* accompanies this distribution and is available at
*
* https://www.eclipse.org/legal/epl-v20.html
*/
package org.junit.jupiter.api;
import static org.junit.jupiter.api.AssertionTestUtils.assertMessageEquals;
import static org.junit.jupiter.api.AssertionTestUtils.expectAssertionFailedError;
import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
import static org.junit.jupiter.api.Assertions.assertEquals;
import java.io.IOException;
import java.util.concurrent.FutureTask;
import org.junit.jupiter.api.function.Executable;
import org.junit.jupiter.api.function.ThrowingSupplier;
import org.opentest4j.AssertionFailedError;
/**
* Unit tests for JUnit Jupiter {@link Assertions}.
*
* @since 5.2
*/
class AssertDoesNotThrowAssertionsTests {
private static final Executable nix = () -> {
};
private static final ThrowingSupplier<String> something = () -> "enigma";
@Test
void assertDoesNotThrowWithMethodReferenceForNonVoidReturnType() {
FutureTask<String> future = new FutureTask<>(() -> {
return "foo";
});
future.run();
String result;
// Current compiler's type inference: does NOT compile since the compiler
// cannot figure out which overloaded variant of assertDoesNotThrow() to
// invoke (i.e., Executable vs. ThrowingSupplier).
//
// result = assertDoesNotThrow(future::get);
// Explicitly as an Executable
assertDoesNotThrow((Executable) future::get);
// Explicitly as a ThrowingSupplier
result = assertDoesNotThrow((ThrowingSupplier<String>) future::get);
assertEquals("foo", result);
}
@Test
void assertDoesNotThrowWithMethodReferenceForVoidReturnType() {
var foo = new Foo();
// Note: the following does not compile since the compiler cannot properly
// perform type inference for a method reference for an overloaded method
// that has a void return type such as Foo.overloaded(...), IFF the
// compiler is simultaneously trying to pick which overloaded variant
// of assertDoesNotThrow() to invoke.
//
// assertDoesNotThrow(foo::overloaded);
// Current compiler's type inference
assertDoesNotThrow(foo::normalMethod);
// Explicitly as an Executable
assertDoesNotThrow((Executable) foo::normalMethod);
assertDoesNotThrow((Executable) foo::overloaded);
}
// --- executable ----------------------------------------------------------
@Test
void assertDoesNotThrowAnythingWithExecutable() {
assertDoesNotThrow(nix);
}
@Test
void assertDoesNotThrowAnythingWithExecutableAndMessage() {
assertDoesNotThrow(nix, "message");
}
@Test
void assertDoesNotThrowAnythingWithExecutableAndMessageSupplier() {
assertDoesNotThrow(nix, () -> "message");
}
@Test
void assertDoesNotThrowWithExecutableThatThrowsACheckedException() {
try {
assertDoesNotThrow((Executable) () -> {
throw new IOException();
});
expectAssertionFailedError();
}
catch (AssertionFailedError ex) {
assertMessageEquals(ex, "Unexpected exception thrown: " + IOException.class.getName());
}
}
@Test
void assertDoesNotThrowWithExecutableThatThrowsACheckedExceptionWithMessage() {
String message = "Checked exception message";
try {
assertDoesNotThrow((Executable) () -> {
throw new IOException(message);
});
expectAssertionFailedError();
}
catch (AssertionFailedError ex) {
assertMessageEquals(ex, "Unexpected exception thrown: " + IOException.class.getName() + ": " + message);
}
}
@Test
void assertDoesNotThrowWithExecutableThatThrowsARuntimeException() {
try {
assertDoesNotThrow((Executable) () -> {
throw new IllegalStateException();
});
expectAssertionFailedError();
}
catch (AssertionFailedError ex) {
assertMessageEquals(ex, "Unexpected exception thrown: " + IllegalStateException.class.getName());
}
}
@Test
void assertDoesNotThrowWithExecutableThatThrowsARuntimeExceptionWithMessage() {
String message = "Runtime exception message";
try {
assertDoesNotThrow((Executable) () -> {
throw new IllegalStateException(message);
});
expectAssertionFailedError();
}
catch (AssertionFailedError ex) {
assertMessageEquals(ex,
"Unexpected exception thrown: " + IllegalStateException.class.getName() + ": " + message);
}
}
@Test
void assertDoesNotThrowWithExecutableThatThrowsAnError() {
try {
assertDoesNotThrow((Executable) AssertionTestUtils::recurseIndefinitely);
expectAssertionFailedError();
}
catch (AssertionFailedError ex) {
assertMessageEquals(ex, "Unexpected exception thrown: " + StackOverflowError.class.getName());
}
}
@Test
void assertDoesNotThrowWithExecutableThatThrowsAnExceptionWithMessageString() {
try {
assertDoesNotThrow((Executable) () -> {
throw new IllegalStateException();
}, "Custom message");
expectAssertionFailedError();
}
catch (AssertionFailedError ex) {
assertMessageEquals(ex,
"Custom message ==> Unexpected exception thrown: " + IllegalStateException.class.getName());
}
}
@Test
void assertDoesNotThrowWithExecutableThatThrowsAnExceptionWithMessageWithMessageString() {
String message = "Runtime exception message";
try {
assertDoesNotThrow((Executable) () -> {
throw new IllegalStateException(message);
}, "Custom message");
expectAssertionFailedError();
}
catch (AssertionFailedError ex) {
assertMessageEquals(ex, "Custom message ==> Unexpected exception thrown: "
+ IllegalStateException.class.getName() + ": " + message);
}
}
@Test
void assertDoesNotThrowWithExecutableThatThrowsAnExceptionWithMessageSupplier() {
try {
assertDoesNotThrow((Executable) () -> {
throw new IllegalStateException();
}, () -> "Custom message");
expectAssertionFailedError();
}
catch (AssertionFailedError ex) {
assertMessageEquals(ex,
"Custom message ==> Unexpected exception thrown: " + IllegalStateException.class.getName());
}
}
@Test
void assertDoesNotThrowWithExecutableThatThrowsAnExceptionWithMessageWithMessageSupplier() {
String message = "Runtime exception message";
try {
assertDoesNotThrow((Executable) () -> {
throw new IllegalStateException(message);
}, () -> "Custom message");
expectAssertionFailedError();
}
catch (AssertionFailedError ex) {
assertMessageEquals(ex, "Custom message ==> Unexpected exception thrown: "
+ IllegalStateException.class.getName() + ": " + message);
}
}
// --- supplier ------------------------------------------------------------
@Test
void assertDoesNotThrowAnythingWithSupplier() {
assertEquals("enigma", assertDoesNotThrow(something));
}
@Test
void assertDoesNotThrowAnythingWithSupplierAndMessage() {
assertEquals("enigma", assertDoesNotThrow(something, "message"));
}
@Test
void assertDoesNotThrowAnythingWithSupplierAndMessageSupplier() {
assertEquals("enigma", assertDoesNotThrow(something, () -> "message"));
}
@Test
void assertDoesNotThrowWithSupplierThatThrowsACheckedException() {
try {
assertDoesNotThrow((ThrowingSupplier<?>) () -> {
throw new IOException();
});
expectAssertionFailedError();
}
catch (AssertionFailedError ex) {
assertMessageEquals(ex, "Unexpected exception thrown: " + IOException.class.getName());
}
}
@Test
void assertDoesNotThrowWithSupplierThatThrowsARuntimeException() {
try {
assertDoesNotThrow((ThrowingSupplier<?>) () -> {
throw new IllegalStateException();
});
expectAssertionFailedError();
}
catch (AssertionFailedError ex) {
assertMessageEquals(ex, "Unexpected exception thrown: " + IllegalStateException.class.getName());
}
}
@Test
void assertDoesNotThrowWithSupplierThatThrowsAnError() {
try {
assertDoesNotThrow((ThrowingSupplier<?>) () -> {
throw new StackOverflowError();
});
expectAssertionFailedError();
}
catch (AssertionFailedError ex) {
assertMessageEquals(ex, "Unexpected exception thrown: " + StackOverflowError.class.getName());
}
}
@Test
void assertDoesNotThrowWithSupplierThatThrowsAnExceptionWithMessageString() {
try {
assertDoesNotThrow((ThrowingSupplier<?>) () -> {
throw new IllegalStateException();
}, "Custom message");
expectAssertionFailedError();
}
catch (AssertionFailedError ex) {
assertMessageEquals(ex,
"Custom message ==> Unexpected exception thrown: " + IllegalStateException.class.getName());
}
}
@Test
void assertDoesNotThrowWithSupplierThatThrowsAnExceptionWithMessageSupplier() {
try {
assertDoesNotThrow((ThrowingSupplier<?>) () -> {
throw new IllegalStateException();
}, () -> "Custom message");
expectAssertionFailedError();
}
catch (AssertionFailedError ex) {
assertMessageEquals(ex,
"Custom message ==> Unexpected exception thrown: " + IllegalStateException.class.getName());
}
}
// -------------------------------------------------------------------------
private static class Foo {
void normalMethod() {
}
void overloaded() {
}
@SuppressWarnings("unused")
void overloaded(int i) {
}
}
}