gpt4 book ai didi

java - 将 Mockito 增强类(class)与常规类(class)进行比较

转载 作者:行者123 更新时间:2023-11-30 01:59:46 25 4
gpt4 key购买 nike

我创建了一个简单的测试类,其中包含两个字段,例如

@Mock
private MyTestClass myTestClass;

@Spy
private final MyContext context = CommonTestData.getDefaultContext();

基本上,我在这里并不真正需要 spy 功能,它只是用于自动将对象注入(inject)到其他模拟中。

对于测试,我尝试像这样配置myTestClass:

when(myTestClass.someMethod(eq(context))).thenReturn(someValue);

现在的问题是,Matchers.eq 匹配 MyContext 的“未增强”版本。因此,当在测试期间使用 MyContext 的“常规”实例调用 someMethod 时,该实例实际上等于用于 context 的值code>, stub 方法不会被调用。

看起来Mockito增强的MyContext类实现了自己的equals方法,至少MyContext的equals方法似乎从未被调用过。因此,我目前想不出任何方法来修改正在进行的实际比较。

我可以想到解决此问题的各种解决方法,例如使用自定义参数匹配器或使用“真实”对象的实例对方法进行 stub 处理。然而我想知道:是否有 Mockito 提供的解决方案来检查增强类与常规类的相等性?

最佳答案

这在概念上是错误的:Java 中 equals() 的思想是对称:当 a.equals(b) then你最好也发现 b.equals(a)!

在你的例子中,a有MyContext类,而b有WhateverMockitoSpyDoesToMyContext。因此,即使当mockito生成的东西的equals()工作时,很可能相反,“base”equals可能会返回false(因为原始的MyContext类知道没有任何关于潜在子类的信息,比如 Mockito 在这里所做的事情)。

我同意,解决你的示例可能会很方便,但我根本不知道到达那里的“正确”方法。从这个角度来看,您实际上必须考虑使用 ArgumentMatcher。

除此之外:认真考虑一下您是否真的通过使用 eq() 获得了任何好处。如果该检查是您测试的“核心”,那么当然,您最好寻找明确的方法来进行该检查。但如果它更多的是副产品:那么只需使用 any() 即可。

含义:不要让您的测试变得不必要的复杂。通常,无论如何,您都会针对一种特定情况进行设置。如果您的测试代码实际上可以正确地将不同的对象传递给该方法,那么您只需担心传递给 someMethod() 的事情。

关于java - 将 Mockito 增强类(class)与常规类(class)进行比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53281157/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com