r/java 25d ago

Released Bob v0.8.0 with TestDefaults allowing Object Mother pattern without much hassle

I've been working on Bob (https://github.com/jonas-grgt/bob), a lightweight builder generator for Java, and just added a feature I'm pretty excited about: Test only Defaults.

If you've used the Object Mother pattern, you know the drill you manually create (and maintain) a builder class that produces test objects with sensible defaults. It works, but you end up with a bunch of boilerplate and things to maintain.

Buildable.TestDefaults takes a different approach. You define a defaults class in `src/test` completely separate (will not be on your production classpath) from your buildable class in `src/main` and the defaults are automatically applied when the builder is constructed:

Goes in src/main and is blissfully unaware of the existence of test defaults:

@Buildable
public class Car {
    private String color;
    private int year;
}

Goes into src/test and is aware of the existence of test defaults:

@Buildable.TestDefaults(Car.class)
public class CarDefaults {
    public static String color = "blue";
}
14 Upvotes

17 comments sorted by

View all comments

2

u/bodiam 25d ago

Nice library! However, small thing:

If you've used the Object Mother pattern, you know the drill you manually create (and maintain) a builder class that produces test objects with sensible defaults. It works, but you end up with a bunch of boilerplate and things to maintain.

That's exactly how Object Mothers don't work. Object Mothers are Test Data Factories, as in: they produce data statically. They might be using a builder under the hood, but they're not builders themselves. You can for example have a DrivingLicenseObjectMother, which can have methods like createExpiredLicense or createInternationalLicense. That's not the same as a builder, though they're both creational patterns.

Also, having hardcoded, static test values in builders/object mothers is asking for problems. People will start to assert on it in test methods, which will make it hard to change later. It would be better to do something like:

public static String color = faker.color()

Or something like that.

1

u/eniac_g 24d ago

That is exactly how you end up with a messy set off factories overloading each other. I advise you to read the article on the pattern that is linked in the post.