当前位置: 首页 > 知识库问答 >
问题:

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

权承
2023-03-14

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

我写了一个jUnit联调来使用一个新创建的java对象来测试该规则,该对象名为“申诉DTO”。

@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.规则est.calculate资格(规则est.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语句。

共有1个答案

洪增
2023-03-14

我能找出问题所在。这是一行代码

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

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

 类似资料:
  • 我们有一个使用Drools规则的遗留Java/Spring项目。有什么方法可以在IntelliJ上调试规则文件,比如添加断点和单步执行规则逻辑?

  • 我的要求是,触发第二条规则,然后停止进程而不触发第三条规则

  • 在为我的项目实现了一些规则之后,我做了一个“ScoreConsistencyCheck”,以确保规则得到了正确的实现。 表示实现我自己的方法,该方法将在我提前终止求解或通过配置终止后调用,输出预期分数。该方法的参数是一个实例,基于解决方案的状态计算预期分数,然后将其与来自解决方案实例的“分数”变量的分数进行比较。 当我使用时,它不会抛出异常,但是当我这样尝试时,我有时会在构建启发式或本地搜索的特定

  • 问题内容: 我正在使用JavaScript测试运行程序“摩卡”。 我的测试失败了,因此我将使用进行调试。 但是运行测试时,没有输出(仅来自Mocha的测试结果)。看来Mocha已捕获并抑制了我的输出! 如何让Mocha显示输出?(对于失败的测试)? 编辑: 抱歉!- 在测试期间可以正常工作!我肯定一直期望它抑制输出,而且我没有正确检查自己的代码。感谢您的回应。所以…话虽如此…也许抑制通过测试的输出

  • 我想针对使用回调参数的RESTendpoint编写一些测试。可能听起来很困惑,所以这里有一个解释: > 服务器回复200和一些json 服务器向(基于提供的回调URL),带有一些json负载 我使用TestNG和Rest assured(非强制性)构建了一个测试。我的问题是如何验证初始回复和在回调URL处接收的消息。我首先想到的一种(可能是幼稚的)方法是实现一个HTTP服务器,它侦听,当有东西出现

  • 在我的应用程序中有,它有一个操作,如下所示: 现在,我正在测试视图和模型,如下所示: 但是我的测试用例失败了,stacktrace如下: 正在运行2个spock测试。。。第1页,共2页 有什么问题吗。