如何让GroovySpock测试比较调用参数时使用equals而不是==

ltskdhd1  于 2023-04-05  发布在  其他
关注(0)|答案(1)|浏览(84)

我为我的Spring应用程序准备了这个Groovy测试。

given:
    def mapProperties = new JSONObject().put(
      "eligibility", "true").put(
      "group", "group1")
when:
    trackingService.sendUnifiedOnboardingAssignmentUserUpdate()
then:
    1 * trackingCollector.send(new UserUpdate(mapProperties))

Tracking Collector是外部的,在我正在扩展的规范中被定义为Spring Bean。

@SpringBean
TrackingCollector trackingCollector = Mock()

trackingService位于我的域层中,并且是自动连线的
测试应该成功运行,但没有。

Too few invocations for:

1 * trackingCollector.send(new UserUpdate(mapProperties))   (0 invocations)

Unmatched invocations (ordered by similarity):

1 * trackingCollector.send(UserUpdate(super=Event(properties={"group":"group1","eligibility":"true"})))
One or more arguments(s) didn't match:
0: argument == expected
   |        |  |
   |        |  UserUpdate(super=Event(properties={"group":"group1","eligibility":"true"})) (com.package.tracking.collector.UserUpdate@4fe5aac9)
   |        false
   UserUpdate(super=Event(properties={"group":"group1","eligibility":"true"})) (com.package.tracking.collector.UserUpdate@48bb5a69)

唯一不同的是@....。但是为什么Groovy不检查对象的实际值,而是选择比较对象?在这种情况下,我需要做什么才能使测试通过?

eqqqjvef

eqqqjvef1#

Spock使用Groovy truth,所以它只会将这两个对象与equals进行比较,或者如果它们实现了Comparable,则与compareTo进行比较。
输出包含对象id是一个红鲱鱼,Spock只在两个对象具有相同的字符串渲染时才将其包含在输出中,以便更容易找出问题所在。
如果不能修复equals实现,可以使用代码参数约束手动检查必要的值。
正如注解中所指出的,您的问题源于这样一个事实,即equals方法没有为您的用例正确实现。

相关问题