Я пытаюсь запустить единое правило как единое целое, чтобы протестировать мое приложение.Мы рассуждаем о том, чтобы работать как единое целое, потому что эти правила содержат довольно сложную бизнес-логику, которую необходимо полностью протестировать.У нас есть другие тесты, которые запускают весь сеанс в целом, но они недостаточно детализированы, чтобы охватить бизнес-логику отдельных правил.Итак, мы просмотрели все статьи «Не тестировать отдельные правила», но все равно решили это сделать из-за нашего конкретного варианта использования.
В любом случае, реальная проблема, с которой я столкнулся, заключается в том, что RuleNameEqualsAgendaFilter мы пытаемсяподать заявление, похоже, не соответствует намеченному поведению, на которое мы надеялись.Хотя я указал как целевую группу повестки дня, так и применил фильтр при запуске правил, все правила, кажется, оцениваются независимо.Это приводит к невозможности тестирования двух правил, которые срабатывают при одинаковых условиях.
Я включил и код для моего теста, и некоторые примеры правил, которые структурно похожи на наши.
Тест
@Slf4j
public class MyUnitTest {
@Test
public void myRuleTest() {
MyFact myFact = new MyFact();
KieSession kieSession = getKieSessionWithFacts("myAgendaGroup", myFact);
fireSpecificRule(kieSession, "My First Rule");
}
private KieSession getKieSession(String agendaGroup) {
KieServices kieServices = KieServices.Factory.get();
KieContainer kieContainer = kieServices.getKieClasspathContainer();
KieSession kieSession = kieContainer.newKieSession("TEST");
kieSession.setGlobal("logger", log);
kieSession.getAgenda().getAgendaGroup(agendaGroup).setFocus();
return kieSession;
}
private KieSession getKieSessionWithFacts(String agendaGroup, Object... facts) {
KieSession kieSession = getKieSession(agendaGroup);
for (Object fact : facts) {
kieSession.insert(fact);
}
return kieSession;
}
private void fireSpecificRule(KieSession kieSession, String ruleName) {
kieSession.fireAllRules(new RuleNameEqualsAgendaFilter(ruleName));
}
}
Правила
rule "My First Rule"
agenda-group "myAgendaGroup"
no-loop true
when
MyFact()
then
logger.info("Fired my first rule");
end
rule "My Second Rule"
agenda-group "myAgendaGroup"
no-loop true
when
MyFact()
then
logger.info("Fired my second rule");
end
rule "My Unrelated Rule"
agenda-group "myOtherAgendaGroup"
no-loop true
when
MyFact()
then
logger.info("Fired my unrelated rule");
end
Вывод, который мы видим в журналах испытаний для этого, выглядит следующим образом:
- Запущено мое первое правило
- Запущено мое второе правило
- Запущено мое несвязанное правило
Это означает, что это не толькофильтр, не ограничивающий правила в myAgendaGroup , но также и правила из myOtherAgendaGroup .
Я хотел бы иметь возможность запустить только первое правило,Чего мне не хватает?