Java 模拟静态方法的Junit Powermock问题
这是我第一次用JUnit做实验,不知怎么的,我遇到了这个问题 以下是我必须测试的类的结构: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
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秒