Вы строите метод generateRule
из-за неверного предположения, что произвольный метод map
выполнил любое реальное действие при вызове. Это не вариант. Тот факт, что map
возвращает другой произвольный экземпляр, дает сильный намек.
Основная идея, которую вы должны понять, заключается в том, что метод провайдера - метод, аннотированный @Provide
, - это не что иное, как «описание»процесс генерации;он будет вызван только один раз. Фактическая генерация объекта происходит впоследствии и контролируется платформой.
Вот переработанный generateRule
метод, который должен делать то, что вы хотели:
@Provide
Arbitrary<Rule> generateRule() {
Arbitrary<Double> lowThresholdArb = Arbitraries.doubles()
.between(0.0, 29.0);
Arbitrary<Double> highThresholdArb = Arbitraries.doubles()
.between(30.0, 50.0);
Arbitrary<RuleConfig> configArb =
Combinators.combine(lowThresholdArb, highThresholdArb)
.as((low, high) -> {
Map<String, Object> ruleProps = new HashMap<>();
ruleProps.put(Utils.LOW_THRESHOLD, low);
ruleProps.put(Utils.HIGH_THRESHOLD, high);
RuleConfig ruleConfig = new RuleConfig();
ruleConfig.setRuleProps(ruleProps);
return ruleConfig;
});
return configArb.map(config -> {
Rule rule = new Rule();
rule.setRuleConfig(config);
return rule;
});
}
То, что вы можете надеяться увидеть, это то, что созданиегенератор подобен программированию потока данных: начиная с некоторых базовых произвольных библиотек - lowThresholdArb
и highThresholdArb
- вы объединяете, отображаете и фильтруете их. В конце должен быть возвращен единственный экземпляр Arbitrary
.
Кстати: если вы хотите, чтобы этот генератор применялся каждый раз, когда вам нужен Rule
, вы можете написать следующий класс:
public class RuleArbitraryProvider implements ArbitraryProvider {
@Override
public boolean canProvideFor(TypeUsage targetType) {
return targetType.isOfType(Rule.class);
}
@Override
public Set<Arbitrary<?>> provideFor(TypeUsage targetType, SubtypeProvider subtypeProvider) {
return Collections.singleton(generateRule());
}
private Arbitrary<Rule> generateRule() {
// Put here the code from above
...
}
}
и регистрируют его в качестве поставщика по умолчанию .