EasyRamdomはJavaのインスタンスをランダムに作ってくれるツール。Property Base Testingツールの一種です。
特徴はこんな感じ
- getter/setter/デフォルトコンストラクタがなくても生成可能(自分はgroovyのspockで試しました。spockでは不要でした。JUnitとかだと試していないです。念の為。)
- 型に合わせてデータを作ってくれる
- 複雑な型もOK
- とにかくシンプル
- 生成方法は柔軟に変更可能
- EnumはEnumの値からランダムで選択してくれる
- BeanValidationと併用するとValidationの制限値内でデータを作ってくれる
結構自分的には理想的なツールです。
dependenciesは一つだけ。
BeanValidationを使用する場合はeasy-random-bean-validationも。
dependencies{
testCompile "org.jeasy:easy-random-core:4.0.0.RC1"
testCompile "org.jeasy:easy-random-bean-validation:4.0.0.RC1"
}
基本
EasyRandom easyRandom = new EasyRandom()
Quantity quantity = easyRandom.nextObject(Quantity.class)
これだけでQuantityオブジェクトが生成されます。
Quantityの中身がどうあれ型に合わせて作ってくれます。
seedは固定のようなので基本毎回同じ値を返してします。なので、seedを指定することをおすすめします。
EasyRandomParameters parameters = new EasyRandomParameters().seed(System.currentTimeMillis())
EasyRandom easyRandom = new EasyRandom(parameters)
Quantity quantity = easyRandom.nextObject(Quantity.class)
生成方法を変更する
Randomizerを作成すると自由に生成方法を変更できます。以下の例は(令和!?)1〜1000の範囲内で生成するようにしています。
EasyRamdomでbuildinのRandomizerもあって、名前や郵便番号などを生成してくれるものらしいです。内部でfakerというツールを使用しているみたいです。
Localeも指定できるようなので、日本語の名前や住所なんかも生成できそう。まだ試してないけど。
使用にはeasy-random-randomizersをdependenciseに追加する必要があります。
public class QuantityRandmizer implements Randomizer<Integer>
{
@Override
public Integer getRandomValue()
{
return ThreadLocalRandom.current().nextInt(1, 1000 + 1);
}
}
EasyRandomParameters parameters = new EasyRandomParameters().seed(System.currentTimeMillis())
.randomize(FieldPredicates.named("value")
.and(FieldPredicates.ofType(Integer.class))
.and(FieldPredicates.inClass(Quantity.class)), new QuantityRandmizer())
EasyRandom easyRandom = new EasyRandom(parameters)
Quantity quantity = easyRandom.nextObject(Quantity.class)
BeanValidationとともに使用
BeanValidationの範囲内で生成することもできます。
以下の例では、100から1000の範囲内で生成されます。
public class Quantity
{
@Min(100)
@Max(1000)
Integer value;
public Quantity(Integer value)
{
this.value = value;
}
}
EasyRandomParameters parameters = new EasyRandomParameters().seed(System.currentTimeMillis())
EasyRandom easyRandom = new EasyRandom(parameters)
Quantity quantity = easyRandom.nextObject(Quantity.class)
素晴らしい!