Skip to content

Commit

Permalink
Use ExceptionCollector for soft assertions in MockMvc
Browse files Browse the repository at this point in the history
  • Loading branch information
sbrannen committed Aug 23, 2021
1 parent 5f47d3b commit cd078ea
Show file tree
Hide file tree
Showing 2 changed files with 56 additions and 24 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@

package org.springframework.test.web.servlet;

import org.springframework.test.util.ExceptionCollector;

/**
* A {@code ResultMatcher} matches the result of an executed request against
* some expectation.
Expand Down Expand Up @@ -81,21 +83,11 @@ static ResultMatcher matchAll(ResultMatcher... matchers) {
*/
static ResultMatcher matchAllSoftly(ResultMatcher... matchers) {
return result -> {
String message = "";
ExceptionCollector exceptionCollector = new ExceptionCollector();
for (ResultMatcher matcher : matchers) {
try {
matcher.match(result);
}
catch (Error | Exception ex) {
if (!message.isEmpty()) {
message += System.lineSeparator();
}
message += ex.getMessage();
}
}
if (!message.isEmpty()) {
throw new AssertionError(message);
exceptionCollector.execute(() -> matcher.match(result));
}
exceptionCollector.assertEmpty();
};
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,9 @@

package org.springframework.test.web.servlet;

import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.Test;

import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
import static org.assertj.core.api.Assertions.assertThatNoException;

Expand All @@ -31,6 +31,8 @@
*/
class ResultMatcherTests {

private static final String EOL = "\n";

private final StubMvcResult stubMvcResult = new StubMvcResult(null, null, null, null, null, null, null);


Expand All @@ -42,36 +44,74 @@ void softAssertionsWithNoFailures() {
}

@Test
void softAssertionsWithOneFailure() {
String failureMessage = "failure message";
ResultMatcher resultMatcher = ResultMatcher.matchAllSoftly(failingMatcher(failureMessage));
void softAssertionsWithOneAssertionError() {
String failureMessage = "error";
ResultMatcher resultMatcher = ResultMatcher.matchAllSoftly(assertionErrorMatcher(failureMessage));

assertThatExceptionOfType(AssertionError.class)
.isThrownBy(() -> resultMatcher.match(stubMvcResult))
.withMessage(failureMessage);
.withMessage(failureMessage)
.withNoCause()
.satisfies(error -> assertThat(error).hasNoSuppressedExceptions());
}

@Test
void softAssertionsWithOneRuntimeException() {
String failureMessage = "exception";
ResultMatcher resultMatcher = ResultMatcher.matchAllSoftly(uncheckedExceptionMatcher(failureMessage));

assertThatExceptionOfType(RuntimeException.class)
.isThrownBy(() -> resultMatcher.match(stubMvcResult))
.withMessage(failureMessage)
.withNoCause()
.satisfies(error -> assertThat(error).hasNoSuppressedExceptions());
}

@Test
void softAssertionsWithOneCheckedException() {
String failureMessage = "exception";
ResultMatcher resultMatcher = ResultMatcher.matchAllSoftly(checkedExceptionMatcher(failureMessage));

assertThatExceptionOfType(Exception.class)
.isThrownBy(() -> resultMatcher.match(stubMvcResult))
.withMessage(failureMessage)
.withNoCause()
.satisfies(exception -> assertThat(exception).hasNoSuppressedExceptions());
}

@Test
void softAssertionsWithTwoFailures() {
String firstFailure = "firstFailure";
String secondFailure = "secondFailure";
ResultMatcher resultMatcher = ResultMatcher.matchAllSoftly(failingMatcher(firstFailure), exceptionalMatcher(secondFailure));
String thirdFailure = "thirdFailure";
ResultMatcher resultMatcher = ResultMatcher.matchAllSoftly(assertionErrorMatcher(firstFailure),
checkedExceptionMatcher(secondFailure), uncheckedExceptionMatcher(thirdFailure));

assertThatExceptionOfType(AssertionError.class)
.isThrownBy(() -> resultMatcher.match(stubMvcResult))
.withMessage(firstFailure + System.lineSeparator() + secondFailure);
.withMessage("Multiple Exceptions (3):" + EOL + firstFailure + EOL + secondFailure + EOL + thirdFailure)
.satisfies(error -> assertThat(error.getSuppressed()).hasSize(3));
}

private ResultMatcher failingMatcher(String failureMessage) {
return result -> Assertions.fail(failureMessage);
private ResultMatcher assertionErrorMatcher(String failureMessage) {
return result -> {
throw new AssertionError(failureMessage);
};
}

private ResultMatcher exceptionalMatcher(String failureMessage) {
private ResultMatcher uncheckedExceptionMatcher(String failureMessage) {
return result -> {
throw new RuntimeException(failureMessage);
};
}

void doNothing(MvcResult mvcResult) {}
private ResultMatcher checkedExceptionMatcher(String failureMessage) {
return result -> {
throw new Exception(failureMessage);
};
}

void doNothing(MvcResult mvcResult) {
}

}

0 comments on commit cd078ea

Please sign in to comment.