Adding Bean Validation

Sometimes, you might want to create a valid test object that adheres to the constraints specified by the Bean Validation annotations on your class.

Fixture Monkey supports constraint annotations from the jakarta.validation.constraints and javax.validation.constraints packages.

To enable this feature, you need to add the fixture-monkey-jakarta-validation dependency (or fixture-monkey-javax-validation if you are using javax.validation.constraints) to your project as follows:

Gradle
testImplementation("com.navercorp.fixturemonkey:fixture-monkey-jakarta-validation:1.1.2")
Maven
<dependency>
  <groupId>com.navercorp.fixturemonkey</groupId>
  <artifactId>fixture-monkey-jakarta-validation</artifactId>
  <version>1.1.2</version>
  <scope>test</scope>
</dependency>

Fixture Monkey provides additional features as plugins.

To generate objects based on Bean Validation annotations, you need to add the JakartaValidationPlugin (or JavaxValidationPlugin if you are using javax.validation.constraints) option to FixtureMonkey as shown below. If you’ve added the fixture-monkey-starter dependency, it’s already in place.

FixtureMonkey fixtureMonkey = FixtureMonkey.builder()
    .plugin(new JakartaValidationPlugin()) // or new JavaxValidationPlugin()
    .build();

Let’s assume that we have added several validation annotations to the previous Product class.

@Value
public class Product {
    @Min(1)
    long id;

    @NotBlank
    String productName;

    @Max(100000)
    long price;

    @Size(min = 3)
    List<@NotBlank String> options;

    @Past
    Instant createdAt;
}

With the FixtureMonkey instance we created earlier, we can now generate valid objects:

@Test
void test() {
    // given
    FixtureMonkey fixtureMonkey = FixtureMonkey.builder()
        .objectIntrospector(ConstructorPropertiesArbitraryIntrospector.INSTANCE)
        .plugin(new JakartaValidationPlugin())
        .build();

    // when
    Product actual = fixtureMonkey.giveMeOne(Product.class);

    // then
    then(actual).isNotNull();
    then(actual.getId()).isGreaterThan(0);
    then(actual.getProductName()).isNotBlank();
    then(actual.getPrice()).isLessThanOrEqualTo(100000);
    then(actual.getOptions().size()).isGreaterThanOrEqualTo(3);
    then(actual.getOptions()).allSatisfy(it -> then(it).isNotEmpty());
    then(actual.getCreatedAt()).isNotNull().isLessThanOrEqualTo(Instant.now());
}

From the assertions, it’s clear that the object created with FixtureMonkey meets all the validation annotation requirements.