javaspring-jdbcdbunitspring-test-dbunitdbrider

How to represent a bytes array with DB Rider in YAML configuration


I have a series of test cases using Spring Jdbc, Database Rider, and H2 — with Java 17.x. Everything works fine, but I can't find a way to represent a byte array in the YAML configuration file :/

This is what I have:

@Getter
@Builder
public final class Category {
  ...

  private byte[] picture;
}
public class CategoryJdbc implements ICategoryJdbc {
  private static final RowMapper<Category> ROW_MAPPER = (rs, rowNum) -> Category.builder()
      ...
      .picture(rs.getBytes("picture"))
      .build();

  private final NamedParameterJdbcTemplate template;

  @Override
  @Transactional(readOnly = true)
  public Optional<Category> findById(final Long primaryKey) {
    final var result = template.queryForObject(queries.getProperty("find-category-by-identifier"),
        new MapSqlParameterSource("id", primaryKey), ROW_MAPPER);
    return Optional.ofNullable(result);
  }
}
@DBRider
@ExtendWith(SpringExtension.class)
class CategoryJdbcTest {
  @Autowired
  private ICategoryJdbc jdbc;

  @Test
  @DataSet("categories.yml")
  void findById_WhenEntityExists() {
    Assertions.assertThat(jdbc.findById(1L)).hasValueSatisfying(it -> {
      Assertions.assertThat(it.getId()).isEqualTo(1);
      Assertions.assertThat(it.getName()).isEqualTo("Beverages");
      Assertions.assertThat(it.getDescription()).isEqualTo("Soft drinks, coffees, teas, beers, and ales");
      Assertions.assertThat(it.getPicture())
          .isEqualTo(new byte[] { 0x4c, 0x6f, 72, 65, 0x6d, 20, 69, 70, 73, 75, 0x6d });
    });
  }
}

categories:
  - id: 1
    name: "Beverages"
    description: "Soft drinks, coffees, teas, beers, and ales"
    picture: \x4c6f72656d20697073756d # Lorem ipsum

For testing, I converted Lorem ipsum to a bytes array: 4c 6f 72 65 6d 20 69 70 73 75 6d.

Does anyone knows how to represent the same in the YAML file, in such way that rs.getBytes("picture") interprets it correctly?

I've tested this with the built-in H2 binary data types as well — because bytea is built-in a PostgreSQL data type, but looks like it works as well in H2, even though I don't see it listed in H2's website.


Solution

  • After searching all over the places I found this issue. Looks like Database Rider needs the binary data "converted" with (the popular) Base 64 binary-to-text algorithm. I think that makes sense, but I was under the assumption that all configuration files would store the data, in exactly the same format as the database — but for binary data, they have a small "indirection" layer.

    Anyway, for my example, I took the Lorem ipsum string as my data source. I then converted this string to a bytes array: new byte[] { 76, 111, 114, 101, 109, 32, 105, 112, 115, 117, 109 }, and finally encoded the resultant bytes array into Base64: TG9yZW0gaXBzdW0= ...and that's how it should be stored in the configuration files for Database Rider.

    I use this snippet Base64.getEncoder().encodeToString("Lorem ipsum".getBytes(StandardCharsets.UTF_8)) to do all the conversion ceremony.