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);
我正在使用 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);