diff --git a/spring-test/src/main/java/org/springframework/test/AssertThrows.java b/spring-test/src/main/java/org/springframework/test/AssertThrows.java index 5d261fdd6b..dd55e3fc58 100644 --- a/spring-test/src/main/java/org/springframework/test/AssertThrows.java +++ b/spring-test/src/main/java/org/springframework/test/AssertThrows.java @@ -16,6 +16,8 @@ package org.springframework.test; +import org.springframework.util.Assert; + /** * {@code AssertThrows} is a simple method object that encapsulates the * 'test-for-exception' scenario for unit testing. Intended for @@ -54,12 +56,12 @@ package org.springframework.test; * *
"Must have thrown a [class java.lang.IllegalArgumentException]"* - *
If the wrong type of {@code Exception} was thrown, + *
If the wrong type of {@code Throwable} was thrown, * the test will also fail, this time with a message similar to the following: * *
"java.lang.AssertionError: Was expecting a [class java.lang.UnsupportedOperationException] to be thrown, but instead a [class java.lang.IllegalArgumentException] was thrown"* - *
The test for the correct {@code Exception} respects polymorphism, + *
The test for the correct {@code Throwable} respects polymorphism, * so you can test that any old {@code Exception} is thrown like so: * *
@@ -83,54 +85,47 @@ package org.springframework.test;
* {@code @Test(expectedExceptions=...)} support
*/
@Deprecated
-@SuppressWarnings({ "unchecked", "rawtypes" })
public abstract class AssertThrows {
- private final Class expectedException;
+ private final Class extends Throwable> expectedException;
private String failureMessage;
- private Exception actualException;
+ private Throwable actualException;
/**
* Create a new instance of the {@code AssertThrows} class.
- * @param expectedException the {@link Exception} expected to be
+ * @param expectedException the {@link Throwable} expected to be
* thrown during the execution of the surrounding test
* @throws IllegalArgumentException if the supplied {@code expectedException} is
- * {@code null}; or if said argument is not an {@code Exception}-derived class
+ * {@code null}; or if said argument is not a {@code Throwable}-derived class
*/
- public AssertThrows(Class expectedException) {
+ public AssertThrows(Class extends Throwable> expectedException) {
this(expectedException, null);
}
/**
* Create a new instance of the {@code AssertThrows} class.
- * @param expectedException the {@link Exception} expected to be
+ * @param expectedException the {@link Throwable} expected to be
* thrown during the execution of the surrounding test
* @param failureMessage the extra, contextual failure message that will be
* included in the failure text if the text fails (can be {@code null})
* @throws IllegalArgumentException if the supplied {@code expectedException} is
- * {@code null}; or if said argument is not an {@code Exception}-derived class
+ * {@code null}; or if said argument is not a {@code Throwable}-derived class
*/
- public AssertThrows(Class expectedException, String failureMessage) {
- if (expectedException == null) {
- throw new IllegalArgumentException("The 'expectedException' argument is required");
- }
- if (!Exception.class.isAssignableFrom(expectedException)) {
- throw new IllegalArgumentException(
- "The 'expectedException' argument is not an Exception type (it obviously must be)");
- }
+ public AssertThrows(Class extends Throwable> expectedException, String failureMessage) {
+ Assert.notNull(expectedException, "expectedException is required");
+ Assert.isAssignable(Throwable.class, expectedException, "expectedException: ");
this.expectedException = expectedException;
this.failureMessage = failureMessage;
}
-
/**
- * Return the {@link java.lang.Exception} expected to be thrown during
+ * Return the {@link java.lang.Throwable} expected to be thrown during
* the execution of the surrounding test.
*/
- protected Class getExpectedException() {
+ protected Class extends Throwable> getExpectedException() {
return this.expectedException;
}
@@ -150,31 +145,29 @@ public abstract class AssertThrows {
return this.failureMessage;
}
-
/**
* Subclass must override this {@code abstract} method and
* provide the test logic.
- * @throws Exception if an error occurs during the execution of the
+ * @throws Throwable if an error occurs during the execution of the
* aforementioned test logic
*/
- public abstract void test() throws Exception;
-
+ public abstract void test() throws Throwable;
/**
* The main template method that drives the running of the
* {@linkplain #test() test logic} and the
- * {@linkplain #checkExceptionExpectations(Exception) checking} of the
- * resulting (expected) {@link java.lang.Exception}.
+ * {@linkplain #checkExceptionExpectations(Throwable) checking} of the
+ * resulting (expected) {@link java.lang.Throwable}.
* @see #test()
* @see #doFail()
- * @see #checkExceptionExpectations(Exception)
+ * @see #checkExceptionExpectations(Throwable)
*/
public void runTest() {
try {
test();
doFail();
}
- catch (Exception actualException) {
+ catch (Throwable actualException) {
this.actualException = actualException;
checkExceptionExpectations(actualException);
}
@@ -182,7 +175,7 @@ public abstract class AssertThrows {
/**
* Template method called when the test fails; i.e. the expected
- * {@link java.lang.Exception} is not thrown.
+ * {@link java.lang.Throwable} is not thrown.
* The default implementation simply fails the test by throwing an
* {@link AssertionError}.
*
If you want to customize the failure message, consider overriding
@@ -212,18 +205,17 @@ public abstract class AssertThrows {
/**
* Does the donkey work of checking (verifying) that the
- * {@link Exception} that was thrown in the body of the test is
+ * {@link Throwable} that was thrown in the body of the test is
* an instance of the {@link #getExpectedException()} class (or an
* instance of a subclass).
*
If you want to customize the failure message, consider overriding
- * {@link #createMessageForWrongThrownExceptionType(Exception)}.
- * @param actualException the {@link Exception} that has been thrown
+ * {@link #createMessageForWrongThrownExceptionType(Throwable)}.
+ * @param actualException the {@link Throwable} that has been thrown
* in the body of a test method (will never be {@code null})
*/
- protected void checkExceptionExpectations(Exception actualException) {
+ protected void checkExceptionExpectations(Throwable actualException) {
if (!getExpectedException().isAssignableFrom(actualException.getClass())) {
- AssertionError error =
- new AssertionError(createMessageForWrongThrownExceptionType(actualException));
+ AssertionError error = new AssertionError(createMessageForWrongThrownExceptionType(actualException));
error.initCause(actualException);
throw error;
}
@@ -231,11 +223,11 @@ public abstract class AssertThrows {
/**
* Creates the failure message used if the wrong type
- * of {@link java.lang.Exception} is thrown in the body of the test.
+ * of {@link java.lang.Throwable} is thrown in the body of the test.
* @param actualException the actual exception thrown
* @return the message for the given exception
*/
- protected String createMessageForWrongThrownExceptionType(Exception actualException) {
+ protected String createMessageForWrongThrownExceptionType(Throwable actualException) {
StringBuilder sb = new StringBuilder();
sb.append("Was expecting a [").append(getExpectedException().getName());
sb.append("] to be thrown, but instead a [").append(actualException.getClass().getName());
@@ -243,12 +235,11 @@ public abstract class AssertThrows {
return sb.toString();
}
-
/**
* Expose the actual exception thrown from {@link #test}, if any.
* @return the actual exception, or {@code null} if none
*/
- public final Exception getActualException() {
+ public final Throwable getActualException() {
return this.actualException;
}