Java PowerMock和mocking oracle ArrayDescriptor

Java PowerMock和mocking oracle ArrayDescriptor,java,oracle,testing,mockito,powermock,Java,Oracle,Testing,Mockito,Powermock,我对嘲弄预言家有意见。下面是一个代码示例: 假设我有这样的方法 public void doSomething(){ //some code here ArrayDescriptor arrayDescriptor = ArrayDescriptor.createDescriptor("TEST", connection); //some more code } 我该如何嘲笑arrayDescriptor的角色? 我试过这样的方法: PowerMock

我对嘲弄预言家有意见。下面是一个代码示例: 假设我有这样的方法

    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,但没有帮助

希望有人能提供帮助:

将调用移动到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 );