Правила слюни из одного и того же пакета, но разные kbases выполняются в тесте, хотя они не должны - PullRequest
1 голос
/ 03 июня 2019

У меня есть два kbases, каждый из которых относится к одному и тому же пакету, но разные шаблоны правил drools (.drt). Каждый файл .drt ссылается на один и тот же файл .xls. Когда я запускаю тесты отдельно, все в порядке. Но когда я запускаю весь тест за один раз, активируются правила из других файлов .drt из того же пакета. Если правило никогда не использовалось, оно не активировалось бы. Как только правило используется, оно будет активировано в других ksessions, где они не должны.

Я пытался разделить все на разные пакеты, все отлично работает. Но я не хочу дублировать xls, так как он будет изменен не техническими пользователями.

Вот этот модуль

<?xml version="1.0" encoding="UTF-8"?>
<kmodule xmlns="http://www.drools.org/xsd/kmodule" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

    <kbase name="prsGrass" default="false" eventProcessingMode="stream"
           packages="prsGrass, autograder">                    
        <ruleTemplate dtable="com/esteam8/nikolay/expert/equipment/autograder/autograders.xls"
                      template="com/esteam8/nikolay/expert/equipment/autograder/soilExcavation/soilExcavation.drt"
                      row="6" col="1"/>
        <ruleTemplate dtable="com/esteam8/nikolay/expert/equipment/autograder/autograders.xls"
                      template="com/esteam8/nikolay/expert/equipment/autograder/soilExcavation/setExcavationSoilCoef.drt"
                      row="13" col="26"/>                                                                                                                               
        <ksession name="prsGrassCutKS" type="stateful" default="false"/>
    </kbase> 

    <kbase name="autograderLeveling" default="false" eventProcessingMode="stream"
           packages="autograder, expert">
        <ruleTemplate dtable="com/esteam8/nikolay/expert/equipment/autograder/autograders.xls"
                      template="com/esteam8/nikolay/expert/equipment/autograder/leveling.drt"
                      row="6" col="1"/>
        <ruleTemplate dtable="com/esteam8/nikolay/expert/equipment/autograder/autograders.xls"
                      template="com/esteam8/nikolay/expert/equipment/autograder/setSoilCoef.drt"
                      row="6" col="26"/>                                                                                                                                     
        <ksession name="autograderLevelingKS" type="stateful" default="false"/>
    </kbase>

</kmodule>

И тесты

public class PavementTest {

    @Test
    public void prsGrassCutTest() {
        KieSession session = Expert.create("prsGrassCutKS")
            .work("XX-XXXX-X9", "природно-растительный слой срезка", "1", "m^2")
            .parameter("SOIL-GROUP", "3")
            .and()
            .build();

        session.fireAllRules();

        session.dispose();
        System.out.println("###################################################################################");
    }


    @Test
    public void autograderLevelingTest() {
        KieSession session = Expert.create("autograderLevelingKS")
            .work("XX-XXXX-X12", "Планировка площадей автогрейдером", "1", "m^2")
            .parameter("SOIL-GROUP", "3")
            .and()
            .build();

        session.fireAllRules();
        session.dispose();
        System.out.println("###################################################################################");
    }

}

Вот результаты с консоли

Soil Excavation
LABOR, Машинист автогрейдера (Разряд 8), E1, Soil1
EQUIPMENT, Автогрейдер XCMG GR215, Soil1, null
AUTOGRADERS, Soil2, Soil1
###################################################################################
Leveling
LABOR, Машинист автогрейдера (Разряд 8), E1, Soil1
LABOR, Машинист автогрейдера (Разряд 8), E1, Soil1
EQUIPMENT, Автогрейдер XCMG GR215, Soil1, null
AUTOGRADERS, Leveling2, Soil1
AUTOGRADERS, Soil2, Soil1
###################################################################################

Из консоли вы можете заметить, что во втором тесте есть два AUTOGRADERS и LABOR. Там должен быть только один. Кроме того, эти АВТОГРАДЕРЫ не должны иметь ничего общего с почвой, так как это выравнивающая работа. Во втором тесте .drt с правилами для «грунта» правила активировались с помощью «выравнивания» .drt. Итак, два .drts были перекрыты.

Вот репозиторий github для тех, кто хочет воспроизвести пример https://github.com/Kusbek/myProject

...