Java 模拟静态方法的Junit Powermock问题

Java 模拟静态方法的Junit Powermock问题,java,junit,mockito,powermock,powermockito,Java,Junit,Mockito,Powermock,Powermockito,这是我第一次用JUnit做实验,不知怎么的,我遇到了这个问题 以下是我必须测试的类的结构: public class ClassA extends AbstractClassA { @Override public java.lang.AutoCloseable createInstance() { ClassC provider = new ClassC(); ... /*Following line is the pr

这是我第一次用JUnit做实验,不知怎么的,我遇到了这个问题

以下是我必须测试的类的结构:

public class ClassA extends AbstractClassA {

        @Override
    public java.lang.AutoCloseable createInstance() {
        ClassC provider = new ClassC();
        ...
        /*Following line is the problematic area - Class A invoking the static method of Class B with some parameters*/
        ClassB.init(getPort(),getConnectorUsername(),getConnectorPassword(),schemaRegistry,schemaContextFactory,getDefaultRequestTimeoutMillis(),bundleContext,domBroker,bindingBroker,getClientDispatcherDependency());
        return provider;
    }
我正在编写一个junit测试用例,用于测试createInstance,如下所示:

    @RunWith(PowerMockRunner.class)
    @PrepareForTest({ClassB.class,
                     ClassA.class})
    public class ClassATest {

        @Test
        public void testCreateInstance() throws Exception {
            // configure mocks
            DependencyResolver dependencyResolver = mock(DependencyResolver.class);
            BindingAwareBroker bindingAwareBroker = mock(BindingAwareBroker.class);

            when(dependencyResolver.resolveInstance(eq(BindingAwareBroker.class), any(ObjectName.class), any(JmxAttribute.class))).thenReturn(bindingAwareBroker);

            // create instance of module with injected mocks
            ClassA module = new ClassA(mock(ModuleIdentifier.class), dependencyResolver);

            // Approach 1 to - Mock the ClassB' static method, stub init() to return 
            //PowerMockito.mockStatic(ClassB.class);
            //PowerMockito.doNothing().when(ClassB.class, "init", anyInt(), anyString(), anyString(), any(SchemaSourceRegistry.class), any(SchemaContextFactory.class), anyLong(), 
            //      any(BundleContext.class), any(Broker.class), any(BindingAwareBroker.class), any(NetconfClientDispatcher.class));

            /* Approach 2 to - Mock the ClassB' static method, stub init() to return 
            //PowerMockito.spy(ClassB.class);
            //PowerMockito.doNothing().when(ClassB.class);
            //ClassB.init(anyInt(), anyString(), anyString(), any(SchemaSourceRegistry.class), any(SchemaContextFactory.class), anyLong(), 
            //      any(BundleContext.class), any(Broker.class), any(BindingAwareBroker.class), any(NetconfClientDispatcher.class));*/

            // getInstance calls resolveInstance to get the broker dependency and then calls createInstance
            AutoCloseable closeable = module.getInstance();


        }
    }
我的问题是如何正确地做到这一点。module.createInstance在方法中调用ClassB.init的点引发空指针异常。 如果我从Class.createInstance中注释ClassB.init方法,测试通过,这意味着我没有正确地模拟它

我使用了两种模拟方法,因为init是一种静态方法,但它们都不起作用


有人能告诉我这个问题的根本原因,或者在编写JUnit测试时如何处理这类问题吗?

这不是一个问题,请花些时间让您的代码只代表这个问题。目前,它有很多噪音,这使得你很难理解你想要什么,不费一点力气。@user3707125Updated@SahilShah,我可能可以帮你,但我需要更多的信息。显示AutoCloseable.getInstance()调用ClassB.init()的位置。还要粘贴空指针异常的错误消息。@Lencalot module.getInstance()首先调用resolveInstance,然后调用createInstance。甚至module.createInstance()也会获取相同的结果。我将共享错误日志。你能评论一下mock ClassB.init()的方法是正确的吗。非常感谢您提出解决此问题的希望。@Lencalot testCreateInstance(org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.callhome.impl.rev141210.ClassATest)运行时间:0.297秒