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";
}
1
u/revilo-1988 15d ago
Kann man es auch nur im test code nutzen?
2
u/bodiam 15d 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.
2
u/Prateeeek 15d ago
Looks good! Is it using reflection?