如何使用Powermock或Mockito模拟接口数组

Pra*_*eep 2 mockito powermock powermockito

我在嘲笑一个抛出的接口数组 java.lang.IllegalArgumentException: Cannot subclass final class class.

以下是我所做的更改。

按照完全相同的顺序在类级别添加了以下注释:

@Runwith(PowerMockRunner.class)
@PrepareForTest({ Array1[].class, Array2[].class })
Run Code Online (Sandbox Code Playgroud)

在课堂上,我这样做:

Array1[] test1= PowerMockito.mock(Array1[].class);
Array2[] test2= PowerMockito.mock(Array2[].class);
Run Code Online (Sandbox Code Playgroud)

和内部测试方法:

Mockito.when(staticclass.somemethod()).thenReturn(test1);
Mockito.when(staticclass.somediffmethod()).thenReturn(test2);
Run Code Online (Sandbox Code Playgroud)

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

Gho*_*ica 5

对您的问题开辟另一种观点:我认为您将单元测试弄错了。

您仅使用模拟框架来控制提供给被测代码的单个对象的行为。但是嘲笑一系列东西是没有意义的。

当您的“正在测试的类”需要处理某些数组,列表,映射等任何内容时,您可以为其提供数组,列表或映射-您只需确保该数组/集合中的元素...根据您的需要。也许一个测试的数组为空,也许另一个测试的数组为空,或者第三测试的模拟对象。

含义-您不这样做:

SomeInterface[] test1 = PowerMock.mock() ...
Run Code Online (Sandbox Code Playgroud)

相反,您可以这样做:

SomeInterface[] test1 = new SomeInterface[] { PowerMock.mock(SomeInterface.class) };
Run Code Online (Sandbox Code Playgroud)

并留意一些注意事项:

  • 至少在您的代码中,看起来您将接口称为“ Array1”和“ Array2”。这是极具误导性的。给接口名称说明其行为的含义。后来您创建包含该接口对象的数组的事实……根本没有关系!
  • 除非您有充分的理由,否则请考虑使用PowerMock。PowerMock依靠字节码操作。并可能导致很多问题。在大多数情况下,人们编写了无法测试的代码。然后他们转向PowerMock进行测试。但是正确的答案是重新设计那个破损的设计,并使用一个名称不带“功能”的模拟框架。您可以观看这些视频,详细说明如何编写可测试的代码!