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

时间:2016-07-19 11:15:28

标签: mockito powermock powermockito

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

的接口数组

以下是我所做的更改。

按照以下确切顺序在课程级别添加了以下注释:

@Runwith(PowerMockRunner.class)
@PrepareForTest({ Array1[].class, Array2[].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);

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

1 个答案:

答案 0 :(得分:5)

为您的问题开辟另一个视角:我认为您的单元测试错误。

您只能使用模拟框架来控制您提供给测试中的代码的个人对象的行为。但是嘲笑一些东西是没有意义的。

当您的课程正在测试时#34;需要处理一些数组,列表,地图等等,然后你提供一个数组,一个列表或一个映射 - 你只需要确保该数组/集合中的元素......就像你需要它们一样。也许数组对于一个测试是空的,也许它包含另一个测试的null,也许它包含一个用于第三次测试的模拟对象。

意义 - 你不做:

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

相反,你这样做:

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

并允许一些注释:

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