如何使用 powermock 或 mockito 模拟接口数组

How to mock an array of interfaces using powermock or mockito

我正在模拟一个抛出 java.lang.IllegalArgumentException: Cannot subclass final class class.

的接口数组

以下是我所做的更改。

在 class 层级添加了以下注释,具体顺序如下:

@Runwith(PowerMockRunner.class)
@PrepareForTest({ Array1[].class, Array2[].class })

在class里面我是这样做的:

Array1[] test1= PowerMockito.mock(Array1[].class);
Array2[] test2= PowerMockito.mock(Array2[].class);

和内部测试方法:

Mockito.when(staticclass.somemethod()).thenReturn(test1);
Mockito.when(staticclass.somediffmethod()).thenReturn(test2);

基本上我需要模拟一组接口。 任何帮助将不胜感激。

从另一个角度看待你的问题:我认为你的单元测试有误。

您仅使用模拟框架来控制个人对象的行为您提供给被测代码。但是 mocking 一些东西的数组是没有意义的。

当您的 "class under test" 需要处理一些数组、列表、映射等时,您可以为其提供一个数组、列表或映射 - 您只需确保其中的元素 array/collection ... 是你需要的。也许一个测试的数组是空的,也许它包含另一个测试的 null,也许它包含第三个测试的模拟对象。

意思是 - 你不这样做:

SomeInterface[] test1 = PowerMock.mock() ...

相反,你这样做:

SomeInterface[] test1 = new SomeInterface[] { PowerMock.mock(SomeInterface.class) };

并留出一些注释:

  • 至少在您的代码中,您似乎调用了接口 "Array1" 和 "Array2"。这是极具误导性的。给接口命名,说明它们的行为是关于什么的。您稍后创建包含该接口对象的数组这一事实......根本不重要!
  • 除非您有充分的理由 - 请考虑 使用 PowerMock。 PowerMock 依赖于字节码操作;并且会导致很多问题。在大多数情况下,人们编写了 untestable 代码;然后他们求助于 PowerMock 以某种方式对其进行测试。但正确的答案是重新设计那个破烂的设计,并使用一个名称中没有 "power" 的模拟框架。您可以观看那些 videos 对如何编写可测试代码的冗长解释!