【问题标题】:Elastic4s, mockito and verify with type erasure and implicitsElastic4s,模拟和验证类型擦除和隐式
【发布时间】:2015-06-10 17:31:32
【问题描述】:

在以前版本的 Elastic4s 中,您可以执行类似的操作

val argument1: ArgumentCapture[DeleteIndexDefinition] = ???
verify(client).execute(argument1.capture())
assert(argument1 == ???)

val argument2: ArgumentCapture[IndexDefinition] = ???
verify(client, times(2)).execute(argument2.capture())
assert(argument2 == ???)

在您的测试中执行了几次之后(即一个DeleteIndexDefinition,然后是两个IndexDefinition)。每个验证都将与其类型匹配。

不过,Elastic4s 现在在其client.execute 方法中采用了一个隐式参数。该参数的类型为Executable[T,R],这意味着您现在需要类似

val argument1: ArgumentCapture[DeleteIndexDefinition] = ???
verify(client).execute(argument1.capture())(any[Executable[DeleteIndexDefinition,R]])
assert(argument1 == ???)

val argument2: ArgumentCapture[IndexDefinition] = ???
verify(client, times(2)).execute(argument2.capture())(any[Executable[IndexDefinition,R]])
assert(argument2 == ???)

这样做之后,我遇到了一个错误。 Mockito 在第一次验证中同时考虑了三个client.execute。是的,即使第一个参数的类型不同。

这是因为隐式(第二个参数)在类型擦除之后具有相同的类型Executable

所以断言失败了。如何在此设置中进行测试?

【问题讨论】:

    标签: scala mockito elastic4s


    【解决方案1】:

    现在在 elastic4s 中封装执行每种请求类型的逻辑的方法是使用typeclasses。这就是为什么隐含现在存在的原因。它有助于模块化每种请求类型,并避免了开始潜入 ElasticClient 类的上帝类反模式。

    我能想到的两件事可能会对您有所帮助:

    1. 您已经发布的内容,使用 Mockito 并将隐式作为另一个匹配器传递。这就是您可以使用一般隐式模拟方法的方式。

    2. 不使用 mockito,而是建立一个本地嵌入式节点,并针对真实数据进行尝试。这是我编写 elasticsearch 代码时的首选方法。优点是您正在针对真实服务器测试真实查询,因此不仅要检查它们是否被调用,还要检查它们是否确实有效。 (有些人可能认为这是一个集成测试,但无论我不同意,它都在一个独立的测试中运行,没有外部部门)。

    elastic4s 的最新版本甚至包含一个testkit,这使得获取嵌入式节点变得非常容易。您可以查看几乎所有的单元测试来了解如何使用它。

    【讨论】:

    • 我明白你的意思。我仍然尝试将这两种测试分开,但您的答案更通用。不过我会保持开放一段时间,以防有其他方法。
    【解决方案2】:

    我的解决方案是使用泛型类型创建一个验证。我花了一段时间才意识到,即使没有通用类型,你总是有 AnyRef。

    所以,这样的东西可以工作

    val objs: ArgumentCaptor[AnyRef] = ArgumentCaptor.forClass(classOf[AnyRef])
    verify(client, times(3)).execute(objs.capture())(any())
    val values = objs.getAllValues
    assert(values.get(0).isInstanceOf[DeleteIndexDefinition])
    assert(values.get(1).isInstanceOf[IndexDefinition])
    assert(values.get(2).isInstanceOf[IndexDefinition])
    

    我已经创建了问题和答案。但我会考虑其他答案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-23
      • 1970-01-01
      • 1970-01-01
      • 2020-04-17
      • 2019-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多