RuleNameEqualsAgendaFilter не работает должным образом - PullRequest
0 голосов
/ 10 декабря 2018

Я пытаюсь запустить единое правило как единое целое, чтобы протестировать мое приложение.Мы рассуждаем о том, чтобы работать как единое целое, потому что эти правила содержат довольно сложную бизнес-логику, которую необходимо полностью протестировать.У нас есть другие тесты, которые запускают весь сеанс в целом, но они недостаточно детализированы, чтобы охватить бизнес-логику отдельных правил.Итак, мы просмотрели все статьи «Не тестировать отдельные правила», но все равно решили это сделать из-за нашего конкретного варианта использования.

В любом случае, реальная проблема, с которой я столкнулся, заключается в том, что 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

Вывод, который мы видим в журналах испытаний для этого, выглядит следующим образом:

  1. Запущено мое первое правило
  2. Запущено мое второе правило
  3. Запущено мое несвязанное правило

Это означает, что это не толькофильтр, не ограничивающий правила в myAgendaGroup , но также и правила из myOtherAgendaGroup .

Я хотел бы иметь возможность запустить только первое правило,Чего мне не хватает?

...