如何使用Java集成测试调用Drools规则



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

我编写了一个jUnit集成测试,使用一个新创建的名为"gridanceDTO"的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.n申诉.rules.RuleTest.caculateQualification(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,但基本上它将"category"作为第四个字段,将"serviceType"作为第三个字段。

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

我能够解决这个问题。就是用这行代码。

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

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

最新更新