methods - 防止equals方法的 stub

标签 methods mocking mockito equals stub

我想测试我类(class)的 equals() 方法,但 Mockito 似乎每次都在调用 stub 版本。我的测试如下;

PluginResourceAdapter adapter = mock (PluginResourceAdapter.class);
PluginResourceAdapter other = mock (PluginResourceAdapter.class);

when(adapter.getNumberOfEndpointActivation()).thenReturn(1);
when(other.getNumberOfEndpointActivation()).thenReturn(0);

boolean result = adapter.equals(other);
assertFalse(result);

我知道我不能 stub equals 方法,这意味着 Mockito 应该调用我的真正实现,但它不是。

我也试过这个:
when (adapter.equals(any()).thenCallRealMethod()

但我得到了同样的结果。

最佳答案

甚至超出Mockito's limitations , 模拟对象使用真实的 equals 没有多大意义方法,如果没有其他原因,等于方法几乎总是使用字段,并且模拟对象从不运行它们的任何构造函数或字段初始值设定项。

另外,请注意您正在测试的内容:在 Foo 的测试中, 理想情况下你不应该 mock Foo ,甚至设置一个Foo比较。否则,很容易在不经意间测试 Mockito 是否有效,而不是测试您自己组件的逻辑。

您有一些解决方法:

  • 正如 Garrett Hall 所提到的,创建真实的对象。这可能需要从使用它们的服务中提取“数据对象”,并在使用真实数据对象时模拟服务。总体而言,这可能是一个好主意。
  • 通过子类化 PluginResourceAdapter 或在 Mockito 之外实现相关接口(interface)来创建手动模拟或伪造。这使您可以根据需要定义所有方法,包括 equalshashCode .
  • 创建 equivalentTo方法,与 equals 不同(例如,因此对 Map 或 Set 对象没有那么有用)但它具有可模拟的语义,您可以自己定义。

    这也可以让您测试 equivalentTo自由地模拟,只需拥有equals委托(delegate)给那个可能经过良好测试的实现。
  • 提取一个测试相等性的对象,然后模拟它。您也可以使用 Guava's Equivalence 那里,或 Comparator你在哪里测试a.compareTo(b) == 0 .
    class YourClass {
      class AdapterEquivalence {
        boolean adaptersAreEqual(
            PluginResourceAdapter a, PluginResourceAdapter b) {
          return a.equals(b);
        }
      }
    
      /** Visible for testing. Replace in tests. */
      AdapterEquivalence adapterEquivalence = new AdapterEquivalence();
    }
    

  • 请注意,另一种可能的解决方法— spying on existing instances ——也会redefine equals and hashCode 并且不会在这里帮助你。

    关于methods - 防止equals方法的 stub ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19778592/

    相关文章:

    python - 仅模拟副作用 X 次

    C++ Google Mock - EXPECT_CALL() - 不直接调用时期望不起作用

    javascript - Jest 中 mock 和 unmock 测试的区别

    java - 模型类的 Junit 测试

    java - 为什么我在模拟 TextView 时会收到 InvalidUseOfMatchersException?

    arrays - 修改 Ruby 方法以将整数分区表示为有序字符串(不展平?)

    java - 我在使用 CompareTo 时遇到问题

    java - 该类型的方法未定义。帮我解决它

    java - 为什么使用ArrayList但返回原始类型的方法要求该方法名称包含 “static”?

    java - 检查方法是否返回相应类的实例