JUnit 5

Dependencies

test dependencies in pom.xml
<dependency>
    <groupId>guru.mikelue.foxglove</groupId>
    <artifactId>core</artifactId>
    <version>1.0-SNAPSHOT</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter</artifactId>
    <version>5.10.5</version>
    <scope>test</scope>
</dependency>

Extension

Package: guru.mikelue.foxglove.junit

Annotations

Package: guru.mikelue.foxglove.junit.annotation


@GenData - Annotation to enable data generation for test methods or test class.

Examples

Warning
  • Since JdbcTableFacet is not reusable, you should not use @TableFacetSource field when you are using @TestInstance(Lifecycle.PER_CLASS).

  • Use TableFacetProvider for @TableFacetSource fields while you are using @TestInstance(Lifecycle.PER_CLASS)

See JUnit 5 Examples for complete examples.

Usage of FoxgloveJUnitExtension
import guru.mikelue.foxglove.annotation.*;
import guru.mikelue.foxglove.jdbc.JdbcDataGenerator;
import guru.mikelue.foxglove.jdbc.JdbcTableFacet;
import guru.mikelue.foxglove.junit.FoxgloveJUnitExtension;

@ExtendWith(FoxgloveJUnitExtension.class)
public class JUnit5Test extends AbstractJdbcTestBase {
    private final static int RANDOM_ROWS = gen().ints().range(5, 10).get();

    public JUnit5Test() {}

    /**
     * For @GenData, the name will be same as the method name.
     */
    @Test
    @GenData(facetsNames = { "carsWithFeature" })
    void junit5Method()
    {
        int testedCount = getJdbcTemplate().query(
            """
            SELECT COUNT(DISTINCT cr_id)
            FROM ap_car
                INNER JOIN
                ap_car_feature
                ON cr_id = cf_cr_id
                    AND cf_feature_name = 'Sunroof'
            """,
            rs -> {
                rs.next();
                return rs.getInt(1);
            }
        );

        assertThat(testedCount)
            .isEqualTo(RANDOM_ROWS);
    }

    @TableFacetsSource
    TableFacet[] carsWithFeature()
    {
        var carFacet = JdbcTableFacet.builder(TABLE_CAR)
            .numberOfRows(RANDOM_ROWS)
            .build();

        return new TableFacet[] {
            carFacet,
            JdbcTableFacet.builder(TABLE_CAR_FEATURE)
                .referencing("cf_cr_id")
                    .parent(carFacet, "cr_id")
                    .cardinality(2)
                .column("cf_feature_name")
                    .roundRobin("Sunroof", "Leather Seats")
                .build()
        };
    }

    /**
     * Default data generator for JDBC.
     */
    @DataGeneratorSource
    DataGenerator<?> defaultDataGenerator()
    {
        return new JdbcDataGenerator(getDataSource());
    }

    @BeforeEach
    void setup() {}

    @AfterEach
    void tearDown()
    {
        deleteAll(TABLE_CAR);
    }
}

Functional utility types

Package: guru.mikelue.foxglove.junit.functional

References