我遇到了模拟oracles ArrayDescriptor的问题。这是一个代码示例: 假设我有类似这样的方法
public void doSomething(){
//some code here
ArrayDescriptor arrayDescriptor = ArrayDescriptor.createDescriptor("TEST", connection);
//some more code
}
我应该如何模拟该arrayDescriptor部分? 我试过这样的事情:
PowerMock.mockStatic(ArrayDescriptor.class);
//connection is mocked
ArrayDescriptor arrayDescriptor = Mockito.mock(ArrayDescriptor.class);
//connection is also mocked
Mockito.when(ArrayDescriptor.createDescriptor("TEST", connection).thenReturn(arrayDescriptor);
但是这不起作用,抛出某种与SQLName相关的nullpointerException,我试图模拟SQLName,但没有帮助。
希望有人可以提供帮助:)
答案 0 :(得分:0)
将对ArrayDescriptor.createDescriptor( ... )
的调用移到其自己的类的单行方法中(可以是您正在使用它的类的内部类)。将字段添加到您正在使用此调用的类中,该类具有新类的实例。使用setter或特殊构造函数将此字段设置为与通常值不同的值。然后模拟内部类,让它返回模拟ArrayDescriptor
。所以你可能会得到这样的东西。
public class MyClass{
class ArrayDescriptorFactory{
makeArrayDescriptor(String name, Connection connection){
return ArrayDescriptor.createDescriptor(name, connection);
}
}
private ArrayDescriptorFactory factory;
public MyClass(){
this( new ArrayDescriptorFactory());
}
MyClass(ArrayDescriptorFactory factory){
this.factory = factory;
}
public void doSomething(){
... do stuff ...
factory.makeArrayDescriptor( "something", someConnection );
... do more stuff ...
}
}
并在测试中
@Mock private MyClass.ArrayDescriptorFactory mockFactory;
@Mock private ArrayDescriptor mockArrayDescriptor;
...
initMocks( this );
when( mockFactory.makeArrayDescriptor( anyString(), any( Connection.class )))
.thenReturn( mockArrayDescriptor );
MyClass toTest = new MyClass( mockFactory );