如何使用 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 对如何编写可测试代码的冗长解释!
我正在模拟一个抛出 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 对如何编写可测试代码的冗长解释!