Search code examples
javajdbcjunitjunit4jooq

How to write Unit testing for Jooq Select Query in junit


 public <Class> getClassbyName(String name) {
     private DSLContext context;
    
     return context.selectFrom(Table)
                   .where(Table.NAME.equal(name))
                   .fetchOneInto(Class.class);
} 

I have this kind of function. I need to write a unit test for this Select Query in JOOQ. does anyone have any idea?


Solution

  • Testing clients of your methods

    If you want to test the logic of that method's callers, you could mock the method with a third party library like mockito. This will allow you to produce a set of expected Class return values for a set of known input String name values.

    You can also integration test everything as shown below, that works for your entire application.

    You could try to mock jOOQ itself (and jOOQ offers such tooling), but I highly recommend against it. Sooner than later, you'll be implementing an entire RDBMS.

    Testing your query's correctness

    If you want to be sure that your query itself is correct and doesn't produce e.g. undesired cartesian products or null values, etc. you should run integration tests.

    Ideally, your integration tests are as close as possible to your production environment. For example, if you're using PostgreSQL, then you should run this query on an actual PostgreSQL instance with a known data set. A good utility for running such tests is testcontainers, but there are also other ways to automate tests against an actual database instance.

    A less recommended way (but faster and maybe more convenient if your queries are simple) would be to run your integration tests on an in-memory database, such as H2. This is faster, but the price is high:

    • You can no longer use vendor specific features of your production database product
    • You will have to tweak your database schema to the least common denominator of what's supported between your production database and the test database, e.g. data types, etc.

    However, this is a viable option if your application supports more than one production database product, in case of which the above two caveats are a problem you have in production anyway.

    I'd still use testcontainers for most tests, though. Here's a quick example how easy it is to set up code generation with testcontainers, for example: https://github.com/jOOQ/jOOQ/tree/main/jOOQ-examples/jOOQ-testcontainers-example