java - 如何使用 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 语句。
解决方案
我能够弄清楚这个问题。就是这行代码。
GrievanceDTO grievanceDTO = new GrievanceDTO(id,"NA", "Access/Availability", "NA", "NA", "NA", "NA", "NA");
我没有使用这个实例化,而是使用 setter 方法替换了变量的赋值。
推荐阅读
- c# - ASP.NET Core Razor Pages 多选输入和分页
- python-3.x - 在另一个类中使用来自一个类的组合框中的数据
- java - 如何使对象从左向右缓慢移动
- php - 我在让 ftp_delete 在 PHP 中工作时遇到问题
- android - Android中的SQLite从一个表复制到另一个表适用于一个表,而不适用于具有相同synatx的下一个表
- java - Splunk JAVA SDK - Fetch FiredAlerts(即警报已经触发)
- r - 按需调用的简单示例
- xpath - 使用 xpath 检索脚本内的数据
- macos - 支持图层的 NSTextView 使用 drawsBackground false 进行大量额外绘图
- flutter - Flutter:即使用户操作更改了路线,也显示覆盖