AssertJ-DB

Validez les opérations en bases de données de votre application avec style

Pourquoi c’est nécessaire

Tests

Test de repository
@Test
void testSaveUser() {
  UserEntity user = repository.save(new UserEntity(
    "Homer Simpson",
    "homer@simpson.net")
  );
  assertThat(user).isNotNull();
  assertThat(user.getName()).isEqualTo("Homer Simpson");
}

Tests

Contenu réel de la base
select * from user;
------------ USER ------------
ID | NAME   | EMAIL
1  |        | homer@simpson.net

Tests

Test de repository
@Test
void testSaveUserWithFind() {
  UserEntity savedUser = repository.save(new UserEntity(
    "Lisa Simpson",
    "lisa@simpson.net")
  );
  UserEntity user = repository.getOne(savedUser.getId());
  assertThat(user).isNotNull();
  assertThat(user.getName()).isEqualTo("Lisa Simpson");
}

Tests

Contenu réel de la base
select * from user;
------------ USER ------------
ID | NAME   | EMAIL
1  |        | lisa@simpson.net

Tests

Code source de l’entité
@Entity(name = "user")
public class UserEntity {

  @Id
  @GeneratedValue(generator = "user_seq")
  private Long id;
  @Transient
  private String name;
  private String email;

  public UserEntity(String name, String email) {
    this.name = name;
    this.email = email;
  }
}

Solutions existantes

DbUnit

@Test
@ExpectedDatabase("expected-users.xml")
void testSaveUser() {
  repository.saveAndFlush(new UserEntity(
    "Homer Simpson",
    "homer@simpson.net")
  );
}
<?xml version="1.0" encoding="UTF-8"?>
<dataset>
  <User id="1" name="Homer Simpson" email="homer@simpson.net"/>
</dataset>

DbUnit

Points faibles

  • Manque de souplesse dans les assertions

  • Difficulté de composition

  • XML :'(

Présentation d’AssertJ-DB

Présentation

  • Assertions du contenu en DB

  • Créée par Régis Pouiller en 2014

  • Module AssertJ ( Joel Costigliola, Stefano Cordio )

  • Syntaxe fluide

  • Version 3.0.0

  • Compatible Java >= 8

Concepts : Connexion

  • AssertDbConnection

  • AssertDbConnectionFactory

Concepts : Navigation

  • Table / Request / Changes

  • Row / Column / Value

Concepts : Assertions

  • isNull / isText / isNumber / …​

  • isEqualTo / isNotEqualTo / isBefore / isCloseTo / …​

  • is / isNot / has / …​

Examples

Initialisation de la connexion
class UserRepositoryAssertJDBTest {
  @Autowired
  private DataSource dataSource;
  private AssertDbConnection assertDb;

  @BeforeEach
  void initAssertDbConnection() {
    assertDb = AssertDbConnectionFactory.of(dataSource).create();
  }

Examples

Validation d’une table
@Test
void testSaveUser_Table() {
  repository.saveAndFlush(
    new UserEntity("Homer Simpson", "homer@simpson.net")
  );

  Table table = assertDb.table("user").build();

  assertThat(table)
    .hasNumberOfRows(1)
    .row(0)
    .value("id").isEqualTo(1)
    .value("name").isEqualTo("Homer Simpson")
    .value("email").isEqualTo("homer@simpson.net");
}

Examples

Validation d’une requête
@Test
void testSaveUser_Request() {
  repository.saveAndFlush(
    new UserEntity("Homer Simpson", "homer@simpson.net")
  );

  Request request = assertDb.request(
    "select * from user where email like ?;"
  ).parameters("%@simpson.net").build();

  assertThat(request).hasNumberOfRows(1)
    .row(0)
    .value("id").isEqualTo(1)
    .value("name").isEqualTo("Homer Simpson")
    .value("email").isEqualTo("homer@simpson.net");
}

Examples

Validation des changements
@Test
void testSaveUser_Changes() {
  Changes changes = assertDb.changes().build();
  changes.setStartPointNow();
  repository.saveAndFlush(
    new UserEntity("Homer Simpson", "homer@simpson.net")
  );
  changes.setEndPointNow();

  assertThat(changes)
    .hasNumberOfChanges(1)
    .ofCreationOnTable("user")
    .change(0)
    .rowAtEndPoint()
    .value("name").isEqualTo("Homer Simpson");
}

Extra

Ouput
Table table = assertDb.table("user").build();

// Output the content of the table in the console
Outputs.output(table).toConsole();
[USERS table]
|----------|--------------|------------------|
| ID       | NAME         | EMAIL            |
| (NUMBER) | (TEXT)       | (TEXT)           |
|----------|--------------|------------------|
| 1        | Lisa Simpson | lisa@simpson.net |
|--------------------------------------------|

Nouveautés des dernières versions

Conditions

@Test
void testSaveUser_Conditions() {
  repository.saveAndFlush(
    new UserEntity("Homer Simpson", "homer@simpson.net")
  );

  Condition<String> aSimpson = new Condition<>(
    s -> s != null && s.endsWith("Simpson"),
    "is simpson"
  );

  assertThat(assertDb.table("user").build())
    .row(0)
    .value("name").is(aSimpson);
}

SoftAssertions

@Test
void testSaveUser_SoftAssertions() {
  repository.saveAndFlush(new UserEntity(
    "Lisa Simpson",
    "lisa@simpson.net"));

  SoftAssertions soft = new SoftAssertions();

  soft.assertThat(assertDb.table("user").build())
    .row(0).value("name").isEqualTo("Lisa Simpson");

  soft.assertThat(assertDb.table("family").build())
    .row(0).value("name").isEqualTo("Simpson");

  soft.assertAll();
}

JSR 310

@Test
void testSaveUser_LocalDate() {
  repository.saveAndFlush(
    new UserEntity("Homer Simpson", "homer@simpson.net", "1956-05-12")
  );

  assertThat(assertDb.table("user").build())
    .row(0)
    .value("birthdate").isEqualTo(LocalDate.of(1956, 5, 12));
}

Évolutions prévues pour la 4.0

  • AssertJ Core 4

  • Java 17

  • Amélioration du support JSON

  • Assertions du schema

  • Ce que vous voulez !

Bonus

DbSetup

  • Créée par Ninja Squad

  • Peuple la base de données

  • Java "fluent" API

  • DSL Kotlin

Questions

Feedback

Feedback