如何正确初始化ConstraintVerifier以测试Kotlin中的Optaplanner ConstraintStreams

如何正确初始化ConstraintVerifier以测试Kotlin中的Optaplanner ConstraintStreams,kotlin,optaplanner,Kotlin,Optaplanner,如何在不使用Drools和Quarkus的情况下在Kotlin中初始化ConstraintVerifier? 我已经为optaplanner 8.6.0.Final添加了optaplanner测试JAR和Maven依赖项,并尝试了以下方法: var constraintVerifier : ConstraintVerifier<GroupAssignmentConstraintProvider, GroupAssignmentSolution> = ConstraintVer

如何在不使用Drools和Quarkus的情况下在Kotlin中初始化ConstraintVerifier? 我已经为optaplanner 8.6.0.Final添加了optaplanner测试JAR和Maven依赖项,并尝试了以下方法:

var constraintVerifier : ConstraintVerifier<GroupAssignmentConstraintProvider, GroupAssignmentSolution> =
    ConstraintVerifier.build(GroupAssignmentConstraintProvider(),
        GroupAssignmentSolution::class.java,
        GroupAssignment::class.java) 
使用minGroupSize约束:

    fun minGroupSize(constraintFactory: ConstraintFactory): Constraint {
    return constraintFactory
        .from(GroupAssignment::class.java)
        .groupBy(GroupAssignment::group, count())
        .filter { group, number ->
            number < group!!.minsize
        }
        .penalize("group min Conflict", ofHard(medium))
}
fun minGroupSize(constraintFactory:constraintFactory):约束{
返回约束工厂
.from(GroupAssignment::class.java)
.groupBy(GroupAssignment::group,count())
.filter{组,编号->
数字<组!!.minsize
}
.处罚(“团体最小冲突”,属于中度)
}
告诉我: (GroupAssignmentTest.kt:65指测试中的
.populations()

java.lang.AssertionError:期望值被打破

约束:groupAssignment.solver/group min Conflict

分数说明(0硬/0软):

约束匹配总数:

起诉书:

预计会有点球,但没有

位于org.optaplanner.test.impl.score.stream.DefaultSingleConstraintAservation.assertMatch(DefaultSingleConstraintAservation.java:185) 在org.optaplanner.test.impl.score.stream.DefaultSingleConstraintaSertion.punizations上(DefaultSingleConstraintaSertion.java:82) 在org.optaplanner.test.api.score.stream.SingleConstraintAssertion.populations上(SingleConstraintAssertion.java:121) 在GroupAssignmentTest.lessthanMingGroupSize处(GroupAssignmentTest.kt:65) 在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处 位于sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)中 位于java.lang.reflect.Method.invoke(Method.java:498) 位于org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:675) 位于org.junit.jupiter.engine.execution.MethodInvocation.procedure(MethodInvocation.java:60) 位于org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.Procedue(InvocationInterceptorChain.java:131) 位于org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:149) 位于org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:140) 位于org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:84) 位于org.junit.jupiter.engine.execution.ExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(ExecutableInvoker.java:115) 位于org.junit.jupiter.engine.execution.ExecutableInvoker.lambda$invoke$0(ExecutableInvoker.java:105) 位于org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.Procedue(InvocationInterceptorChain.java:106) 在org.junit.jupiter.engine.execution.InvocationInterceptorChain.procedure(InvocationInterceptorChain.java:64)上 位于org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:45) 位于org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:37) 位于org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:104) 位于org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:98) 位于org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$6(TestMethodTestDescriptor.java:205) 位于org.junit.platform.engine.support.hierarchy.ThrowableCollector.execute(ThrowableCollector.java:73) 位于org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:201) 位于org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:137) 位于org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:71) 位于org.junit.platform.engine.support.hierarchy.NodeTestTask.lambda$ExecuteCursive$5(NodeTestTask.java:135) 位于org.junit.platform.engine.support.hierarchy.ThrowableCollector.execute(ThrowableCollector.java:73) 位于org.junit.platform.engine.support.hierarchy.NodeTestTask.lambda$executecurively$7(NodeTestTask.java:125) 位于org.junit.platform.engine.support.hierarchy.Node.around(Node.java:135) 位于org.junit.platform.engine.support.hierarchy.NodeTestTask.lambda$ExecuteCursive$8(NodeTestTask.java:123) 位于org.junit.platform.engine.support.hierarchy.ThrowableCollector.execute(ThrowableCollector.java:73) 在org.junit.platform.engine.support.hierarchy.NodeTestTask.ExecuteCursive上(NodeTestTask.java:122) 位于org.junit.platform.engine.support.hierarchy.NodeTestTask.execute(NodeTestTask.java:80)

除此之外,约束也起作用

我想,我没有以正确的方式初始化或使用ConstraintVerifier。有人能帮我解决这个问题吗?
谢谢大家!

您的测试有几个问题。首先:

        .given(students, lecturer, configuration)
given()
调用需要单个实例。您正在为它提供实例集合,特别是一组可变的学生。您的约束不执行(Set.class)或类似的操作,因此它不会看到这些实例。你必须枚举你的学生,或者根本不给他们,因为你的约束对学生类既没有
from()
也没有
join()


此外,您的约束确实来自(GroupAssignment.class),但在
given()
参数中没有看到
GroupAssignment
s。再一次,约束流没有任何起点,因此断言消息是正确的-没有任何惩罚。

除了Lukas的回答之外,请查看
TimeTableConstraintProviderTest.kt
在感谢您的提示中,我发现了如何纠正它!
        .given(students, lecturer, configuration)