Improve your unit tests with AssertJ
Tags: java, testing
Published: 2021-04-30 07:32:19

You are probably writing unit tests, if not you probably should. Over the years of my career, I did a lot of workshops, speaks, etc about how to write those correctly. One of the points I always make is to have understandable outputs of those tests. Nothing is worst than failing a unit test with a message like ```Failed. True != False``` what are you supposed to do with that? With standard assertions functions provided by all testing frameworks, you can improve this a bit by using correct functions, providing additional messages, etc... It's not perfect and it sometimes is a lot of work. 

Here comes [AssertJ](https://assertj.github.io/doc/). It's a simple library designed to improve your assertions. I would consider it essential for my testing needs. It provides a vast variety of assertions, state of the art error messages. Also, it improves code readability, it's super simple to understand what you want to assert. 

## Installation

AssertJ is available on Maven central so installation is as simple as adding a test dependency. 

```xml
<dependency>
 <groupId>org.assertj</groupId>
 <artifactId>assertj-core</artifactId>
 <version>3.19.0</version>
 <scope>test</scope>
</dependency>
```

## Usage

In this article, I will go over few examples of how awesome AssertJ is. These examples will be done in JUnit5 with the following structure. 

```java
class DtoComparisonTest {

 @Test
 void testComparison() {
 var x = new TestedDto("a", "c", new TestedNestedDto(1, 2));
 var y = new TestedDto("a", "b", new TestedNestedDto(1, 3));

 Assertions.assertThat(x).isEqualTo(y);
 }

 @Data
 @AllArgsConstructor
 private static class TestedDto {

 String firstString;
 String secondString;
 TestedNestedDto nested;
 }

 @Data
 @AllArgsConstructor
 private static class TestedNestedDto {
 int firstInt;
 int secondInt;
 }

}
```

This example compares the `x` and `y` objects and prints the following error messages.

```
org.opentest4j.AssertionFailedError: 
Expecting:
 <DtoComparisonTest.TestedDto(firstString=a, secondString=c, nested=DtoComparisonTest.TestedNestedDto(firstInt=1, secondInt=2))>
to be equal to:
 <DtoComparisonTest.TestedDto(firstString=a, secondString=b, nested=DtoComparisonTest.TestedNestedDto(firstInt=1, secondInt=3))>
but was not.
Expected :DtoComparisonTest.TestedDto(firstString=a, secondString=b, nested=DtoComparisonTest.TestedNestedDto(firstInt=1, secondInt=3))
Actual :DtoComparisonTest.TestedDto(firstString=a, secondString=c, nested=DtoComparisonTest.TestedNestedDto(firstInt=1, secondInt=2))
```

How awesome is that? 

It has a lot of built-in assertions for String. Let's see some examples:

```java
 @Test
 void testComparison() {

 var x = new TestedDto("Dragon", "Goblin", new TestedNestedDto(1, 2));

 Assertions.assertThat(x.getFirstString())
 .startsWith("D")
 .endsWith("n")
 .isLowerCase();
 }
```

This will output

```
java.lang.AssertionError: 
Expecting <"Dragon"> to be a lowercase
```

Imagine doing this and having the same output with normal assertions. 

It also has tons of built-ins for collections. 

```java
 @Test
 void testComparison() {

 var x = new TestedDto("a", "b", new TestedNestedDto(1, 2));
 var y = new TestedDto("c", "d", new TestedNestedDto(1, 2));
 var collection = Arrays.asList(x, y);

 Assertions.assertThat(collection)
 .hasSize(2)
 .contains(x)
 .allMatch(tested -> tested.getNested().getFirstInt() == 1)
 .anyMatch(tested -> tested.getSecondString().equals("b"))
 .containsNull();
 }
```

Prints this error message

```
java.lang.AssertionError: 
Expecting:
 <[DtoComparisonTest.TestedDto(firstString=a, secondString=b, nested=DtoComparisonTest.TestedNestedDto(firstInt=1, secondInt=2)),
 DtoComparisonTest.TestedDto(firstString=c, secondString=d, nested=DtoComparisonTest.TestedNestedDto(firstInt=1, secondInt=2))]>
to contain a <null> element
```

I am pretty much in love with this library. It's super simple to start with and improves your tests so much. I recommend you to start using it today (also dive into their documentation, there is so much more to AssertJ). 

... 

For more tips like this, you can follow me on [Twitter](https://twitter.com/pavel_polivka).