Mockito 匹配器将方法与泛型和供应商匹配

Mockito matcher to match a method with generics and a supplier

我正在使用 Java 1.8.0_131、Mockito 2.8.47 和 PowerMock 1.7.0。我的问题与 PowerMock 无关,它被发布到 Mockito.when(…) 匹配器。

我需要一个解决方案来模拟我的 class 在测试中调用的这个方法:

public static <T extends Serializable> PersistenceController<T> createController(
    final Class<? extends Serializable> clazz,
    final Supplier<T> constructor) { … }

该方法从被测 class 调用,如下所示:

PersistenceController<EventRepository> eventController =
    PersistenceManager.createController(Event.class, EventRepository::new);

为了测试,我首先创建了我的模拟对象,当调用上述方法时应该 returned:

final PersistenceController<EventRepository> controllerMock =
    mock(PersistenceController.class);

这很容易。问题是方法参数的匹配器,因为该方法将泛型与供应商结合使用作为参数。以下代码按预期进行编译和 returns null:

when(PersistenceManager.createController(any(), any()))
    .thenReturn(null);

当然,我不想return null。我想 return 我的模拟对象。由于泛型,这不会编译。为了符合类型,我必须写这样的东西:

when(PersistenceManager.createController(Event.class, EventRepository::new))
    .thenReturn(controllerMock);

这可以编译,但我 when 中的参数不是匹配器,因此匹配不起作用,null 被 returned。我不知道如何编写匹配我的参数和 return 我的模拟对象的匹配器。你有什么想法吗?

非常感谢 马库斯

问题是编译器无法推断出第二个参数的 any() 的类型。 您可以使用 Matcher.<...>any() 语法指定它:

when(PersistenceManager.createController(
    any(), Matchers.<Supplier<EventRepository>>any())
).thenReturn(controllerMock);

如果您使用的是 Mockito 2(不推荐使用 Matchers),请改用 ArgumentMatchers

when(PersistenceManager.createController(
    any(), ArgumentMatchers.<Supplier<EventRepository>>any())
).thenReturn(controllerMock);