首页 > 解决方案 > 如何使用 Java 集成测试调用 Drools 规则

问题描述

我正在编写一条规则,以根据申诉类别确定应接受的服务类型。

我编写了一个 jUnit 集成测试来使用新创建的名为“grievanceDTO”的 java 对象来测试规则。

@Test
public class RuleTest {

    @Autowired
    private GrievanceRuleService grievanceRuleService;

    @Autowired
    public KieContainer kieContainer;

    @Test 
    public void calculateEligibility() {
        Long id = (long) 1;
        GrievanceDTO grievanceDTO = new GrievanceDTO(id,"NA", "Access/Availability", "NA", "NA", "NA", "NA", "NA");
        String serviceType = grievanceRuleService.determineGrievance(grievanceDTO);
        assertNotNull(serviceType);
    }
}

我写了一个服务类来触发规则。

@Service
public class GrievanceRuleService {

    @Autowired
    public KieContainer kieContainer;
    
    public String determineGrievance(GrievanceDTO grievanceDTO) {
        
        KieSession kieSession = kieContainer.newKieSession();
        kieSession.setGlobal("grievanceDTO", grievanceDTO);
        kieSession.insert(grievanceDTO);
        kieSession.fireAllRules();
        kieSession.dispose();

        return grievanceDTO.getServiceType();
        
    }
}

jUnit 测试失败。

java.lang.NullPointerException 在 cm.grievance.rules.RuleTest.calculateEligibility(RuleTest.java:13)

我用一个 KieContainer bean 编写了一个单独的配置类,我将它自动装配到我的服务中。

@Configuration
@EnableJpaRepositories
@ComponentScan("dm.vantage.producer.service")
public class RuleConfiguration {
    public static final String grivFile = "/src/main/resources/drools/GrievanceRules.drl";

    @Bean
    public KieContainer kieContainer() {
        KieServices kieServices = KieServices.Factory.get();
        
        KieFileSystem kieFileSystem = kieServices.newKieFileSystem();
        kieFileSystem.write(ResourceFactory.newClassPathResource(grivFile));
        KieBuilder kieBuilder = kieServices.newKieBuilder(kieFileSystem);
        kieBuilder.buildAll();
        KieModule kieModule = kieBuilder.getKieModule();
        
        return kieServices.newKieContainer(kieModule.getReleaseId());
    }

}

最后是我的规则 (DRL) 文件,为了进行测试,我将其制作得尽可能简单。

package drools;
//generated from Decision Table
import cm.grievance.service.dto.GrievanceDTO;

rule "grievancesMap_10"
    when
        $grievances:GrievanceDTO($grievances.getCategory().equals("NA"))
    then
        $grievances.setServiceType("Timely Access");
end

我可以添加 dto,但基本上它的第四个字段是“类别”,第三个字段是“服务类型”。

我不知道为什么我得到一个空指针,因为我已经测试过了,它应该用一些值填充 return 语句。

标签: javaspringjunitdrools

解决方案


我能够弄清楚这个问题。就是这行代码。

 GrievanceDTO grievanceDTO = new GrievanceDTO(id,"NA", "Access/Availability", "NA", "NA", "NA", "NA", "NA");

我没有使用这个实例化,而是使用 setter 方法替换了变量的赋值。


推荐阅读