org.assertj.core.api
Class SoftAssertions

java.lang.Object
  extended by org.assertj.core.api.AbstractSoftAssertions
      extended by org.assertj.core.api.SoftAssertions

public class SoftAssertions
extends AbstractSoftAssertions

Suppose we have a test case and in it we'd like to make numerous assertions. In this case, we're hosting a dinner party and we want to ensure not only that all our guests survive but also that nothing in the mansion has been unduly disturbed:

 @Test
 public void host_dinner_party_where_nobody_dies() {
   Mansion mansion = new Mansion();
   mansion.hostPotentiallyMurderousDinnerParty();
   assertThat(mansion.guests()).as("Living Guests").isEqualTo(7);
   assertThat(mansion.kitchen()).as("Kitchen").isEqualTo("clean");
   assertThat(mansion.library()).as("Library").isEqualTo("clean");
   assertThat(mansion.revolverAmmo()).as("Revolver Ammo").isEqualTo(6);
   assertThat(mansion.candlestick()).as("Candlestick").isEqualTo("pristine");
   assertThat(mansion.colonel()).as("Colonel").isEqualTo("well kempt");
   assertThat(mansion.professor()).as("Professor").isEqualTo("well kempt");
 }
 

After running the test, JUnit provides us with the following exception message:

 org.junit.ComparisonFailure: [Living Guests] expected:<[7]> but was:<[6]>
 

Oh no! A guest has been murdered! But where, how, and by whom?

Unfortunately frameworks like JUnit halt the test upon the first failed assertion. Therefore, to collect more evidence, we'll have to rerun the test (perhaps after attaching a debugger or modifying the test to skip past the first assertion). Given that hosting dinner parties takes a long time, this seems rather inefficient.

Instead let's change the test so that at its completion we get the result of all assertions at once. We can do that by using a SoftAssertions instance instead of the static methods on Assertions as follows:

 @Test
 public void host_dinner_party_where_nobody_dies() {
   Mansion mansion = new Mansion();
   mansion.hostPotentiallyMurderousDinnerParty();
   SoftAssertions softly = new SoftAssertions();
   softly.assertThat(mansion.guests()).as("Living Guests").isEqualTo(7);
   softly.assertThat(mansion.kitchen()).as("Kitchen").isEqualTo("clean");
   softly.assertThat(mansion.library()).as("Library").isEqualTo("clean");
   softly.assertThat(mansion.revolverAmmo()).as("Revolver Ammo").isEqualTo(6);
   softly.assertThat(mansion.candlestick()).as("Candlestick").isEqualTo("pristine");
   softly.assertThat(mansion.colonel()).as("Colonel").isEqualTo("well kempt");
   softly.assertThat(mansion.professor()).as("Professor").isEqualTo("well kempt");
   softly.assertAll();
 }
 

Now upon running the test our JUnit exception message is far more detailed:

 org.assertj.core.api.SoftAssertionError: The following 4 assertions failed:
 1) [Living Guests] expected:<[7]> but was:<[6]>
 2) [Library] expected:<'[clean]'> but was:<'[messy]'>
 3) [Candlestick] expected:<'[pristine]'> but was:<'[bent]'>
 4) [Professor] expected:<'[well kempt]'> but was:<'[bloodied and disheveled]'>
 

Aha! It appears that perhaps the Professor used the candlestick to perform the nefarious deed in the library. We should let the police take it from here.

SoftAssertions works by providing you with proxyies of the AssertJ assertion objects (those created by Assertions#assertThat...) whose assertion failures are caught and stored. Only when you call assertAll() will a SoftAssertionError be thrown containing the error messages of those previously caught assertion failures.

Note that because SoftAssertions is stateful you should use a new instance of SoftAssertions per test method. Also, if you forget to call assertAll() at the end of your test, the test will pass even if any assertion objects threw exceptions (because they're proxied, remember?). So don't forget.

It is recommended to use AbstractAssert.as(String, Object...) so that the multiple failed assertions can be easily distinguished from one another.

Author:
Brian Laframboise
See Also:
for the inspiration

Constructor Summary
SoftAssertions()
          Creates a new SoftAssertions.
 
Method Summary
 void assertAll()
          Verifies that no proxied assertion methods have failed.
 
Methods inherited from class org.assertj.core.api.AbstractSoftAssertions
assertThat, assertThat, assertThat, assertThat, assertThat, assertThat, assertThat, assertThat, assertThat, assertThat, assertThat, assertThat, assertThat, assertThat, assertThat, assertThat, assertThat, assertThat, assertThat, assertThat, assertThat, assertThat, assertThat, assertThat, assertThat, assertThat, assertThat, assertThat, assertThat, assertThat, assertThat, assertThat, assertThat, assertThat, assertThat, assertThat, assertThat, assertThat, proxy
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Constructor Detail

SoftAssertions

public SoftAssertions()
Creates a new SoftAssertions.

Method Detail

assertAll

public void assertAll()
Verifies that no proxied assertion methods have failed.

Throws:
SoftAssertionError - if any proxied assertion objects threw


Copyright © 2013–2015 AssertJ. All rights reserved.