こんなクラスがあったとき
public enum Vehicle {
BIKE(false),
MOTOR_CYCLE(true),
CAR(true);
private final boolean needLicence;
Vehicle(boolean b) {
needLicence = b;
}
@Override
public String toString() {
return this.name();
}
public boolean isNeedLicence() {
return needLicence;
}
}
こんなテストの書き方をしていると
@Unroll
class VehicleTest extends Specification {
def "#sut needs licence : #result"() {
expect:
sut.isNeedLicence() == result
where:
sut || result
Vehicle.BIKE || false
Vehicle.MOTOR_CYCLE || true
Vehicle.CAR || true
}
}
ENUMが増えた時にテストコードもメンテしないといけない。
AIR_PLANE(false); // bug
なので、こうします。
def "isNeedLicence"() {
setup:
def notNeedLicenceList = [Vehicle.BIKE]
def needLicenceList = Stream.of(Vehicle.values()).filter {
!notNeedLicenceList.contains(it)
}.collect(Collectors.toList())
expect:
notNeedLicenceList.stream().filter { it.isNeedLicence() }.collect(Collectors.toList()).size() == 0
needLicenceList.stream().filter { !it.isNeedLicence() }.collect(Collectors.toList()).size() == 0
}
免許がいらない乗り物が増えた時はメンテがいるけど、逆に免許がいる乗り物のときはメンテがいらないですし、乗り物増えてもコード量が増えないのがいいですね。