考虑下面给出的代码:
@Override
public void A() {
objectA = objectB.B();
objectA.C(someValue);
objectC = new constructor(objectA,callback());
//Rest of the code
}
}
public Callback callback() {
return new callback() {
@Override
public void someMethod(someArgument) {
//some Code
}
};
}
我正在尝试编写一个单元测试案例:
- 呼叫
objectB.B()
必须被模拟 - 必须嘲笑对构造函数的呼吁
这是我使用Mockito和PowerMockito所做的:
@InjectMocks
ClassBeingTested testObject;
@Mock
ClassB objectB;
@Mock
ClassC objectC;
@Before()
public void setup() {
when(objectB.B()).thenReturn(new ObjectA("someValue"));
whenNew(objectC.class).withArguments(any(),any()).thenReturn(objectC);
}
@Test()
public void testMethod() {
testObject.A();
}
第一个模拟成功起作用,但是使用whenNew
的第二个模拟失败了以下错误:
org.powermock.reflect.exceptions.constructornotfoundexception:class'classc'中没有参数类型中的构造函数:[null]
如果我使用withArguments(objectA, callback())
在测试类中实现了回调,则称为实际构造函数。
我想模拟构造函数调用并限制对实际构造函数的调用。我怎样才能做到这一点?
我无法编辑代码设计,因为这超出了我的范围。
简而言之,由于使用了2个通用 any()
MATCHERS。
当您使用.withArguments(...)
并将两个设置为 any()
> .withArguments(null, null)
(由于任何()可能匹配包括nulls在内的任何东西),最终折叠为单个null和反射API(PowerMock很大程度上依赖)未能发现ClassC(null)的合适构造函数。
您可以查看执行作业的org.powermock.api.mockito.internal.expectation.AbstractConstructorExpectationSetup<T>
来源
要解决问题,请考虑使用.withAnyArguments()
如果您不关心param类型并使所有可用的构造函数固执或在使用 any()
时,请指定更多具体类型 whenNew(ClassC.class).withArguments(any(ClassA.class), any(Callback.class))