带null参数的Powermock白盒调用

带null参数的Powermock白盒调用,null,mockito,powermock,white-box,Null,Mockito,Powermock,White Box,我正在尝试测试一个私有方法,并进行以下设置: public class MyClass { private boolean myprivatemethod(ClassB classBObject, boolean b) { // do stuff here someOtherMethod(); } private void someOtherMethod() { // more stuff } } final MyClass testsubject =

我正在尝试测试一个私有方法,并进行以下设置:

public class MyClass { private boolean myprivatemethod(ClassB classBObject, boolean b) { // do stuff here someOtherMethod(); } private void someOtherMethod() { // more stuff } } final MyClass testsubject = PowerMockito.spy(new MyClass()); // spy is needed because "someOtherMethod" is mocked // which is not shown here for simplicity ClassB classBObject = mock(ClassB.class); boolean result = Whitebox.invokeMethod(testsubject, "myprivatemethod", classBObject, true); 这将导致以下异常:

java.lang.NullPointerException at java.lang.Class.isAssignableFrom(Native Method) at org.powermock.reflect.internal.WhiteboxImpl.checkIfParameterTypesAreSame(WhiteboxImpl.java:2432) at org.powermock.reflect.internal.WhiteboxImpl.getMethods(WhiteboxImpl.java:1934) at org.powermock.reflect.internal.WhiteboxImpl.getBestMethodCandidate(WhiteboxImpl.java:1025) at org.powermock.reflect.internal.WhiteboxImpl.findMethodOrThrowException(WhiteboxImpl.java:948) at org.powermock.reflect.internal.WhiteboxImpl.doInvokeMethod(WhiteboxImpl.java:882) at org.powermock.reflect.internal.WhiteboxImpl.invokeMethod(WhiteboxImpl.java:713) at org.powermock.reflect.Whitebox.invokeMethod(Whitebox.java:401) at test.myproject.TestMyClass.testMyClass(TestMyClass.java:10) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at junit.framework.TestCase.runTest(TestCase.java:154) at junit.framework.TestCase.runBare(TestCase.java:127) at junit.framework.TestResult$1.protect(TestResult.java:106) at junit.framework.TestResult.runProtected(TestResult.java:124) at junit.framework.TestResult.run(TestResult.java:109) at junit.framework.TestCase.run(TestCase.java:118) at junit.framework.TestSuite.runTest(TestSuite.java:208) at junit.framework.TestSuite.run(TestSuite.java:203) at org.powermock.modules.junit3.internal.impl.PowerMockJUnit3RunnerDelegateImpl.run(PowerMockJUnit3RunnerDelegateImpl.java:113) at org.powermock.modules.junit3.internal.impl.JUnit3TestSuiteChunkerImpl.run(JUnit3TestSuiteChunkerImpl.java:165) at org.powermock.modules.junit3.PowerMockSuite.run(PowerMockSuite.java:51) at org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:130) at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) java.lang.NullPointerException 位于java.lang.Class.isAssignableFrom(本机方法) 位于org.powermock.reflect.internal.WhiteboxImpl.checkifParameterTypesAreName(WhiteboxImpl.java:2432) 位于org.powermock.reflect.internal.WhiteboxImpl.getMethods(WhiteboxImpl.java:1934) 位于org.powermock.reflect.internal.WhiteboxImpl.getBestMethodCandidate(WhiteboxImpl.java:1025) 位于org.powermock.reflect.internal.WhiteboxImpl.FindMethodorThroweException(WhiteboxImpl.java:948) 位于org.powermock.reflect.internal.WhiteboxImpl.doInvokeMethod(WhiteboxImpl.java:882) 位于org.powermock.reflect.internal.WhiteboxImpl.invokeMethod(WhiteboxImpl.java:713) 位于org.powermock.reflect.Whitebox.invokeMethod(Whitebox.java:401) 在test.myproject.TestMyClass.TestMyClass(TestMyClass.java:10)中 在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处 位于sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)中 位于java.lang.reflect.Method.invoke(Method.java:597) 位于junit.framework.TestCase.runTest(TestCase.java:154) 位于junit.framework.TestCase.runBare(TestCase.java:127) 位于junit.framework.TestResult$1.protect(TestResult.java:106) 位于junit.framework.TestResult.runProtected(TestResult.java:124) 运行(TestResult.java:109) 运行(TestCase.java:118) 位于junit.framework.TestSuite.runTest(TestSuite.java:208) 运行(TestSuite.java:203) 位于org.powermock.modules.junit3.internal.impl.powermockjunit3runnerdelegateinpl.run(powermockjunit3runnerdelegateinpl.java:113) 位于org.powermock.modules.junit3.internal.impl.JUnit3TestSuiteChunkerImpl.run(JUnit3TestSuiteChunkerImpl.java:165) 位于org.powermock.modules.junit3.PowerMockSuite.run(PowerMockSuite.java:51) 位于org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:130) 位于org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 位于org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) 位于org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) 位于org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) 位于org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) 我正在使用Powermockito 1.5。
有没有办法执行以
null
作为参数的方法?

尝试使用参数匹配器:

import static org.mockito.Matchers.*;

//...

boolean result = Whitebox.invokeMethod(testsubject,
    "myprivatemethod", isNull(ClassB.class), eq(true));

一旦对任何参数使用匹配器,就必须对所有参数使用它们。Mockito文档中提到了这一点(请参阅关于参数匹配器的警告小节)。

尝试改用参数匹配器:

import static org.mockito.Matchers.*;

//...

boolean result = Whitebox.invokeMethod(testsubject,
    "myprivatemethod", isNull(ClassB.class), eq(true));
一旦对任何参数使用匹配器,就必须对所有参数使用它们。Mockito文档中提到了这一点(请参阅关于参数匹配器的警告小节)。

可以尝试以下方法:

Object[] params = {null, true};
然后:

Whitebox.invokeMethod(testsubject, "myprivatemethod", params);
也许可以试试这个:

Object[] params = {null, true};
然后:

Whitebox.invokeMethod(testsubject, "myprivatemethod", params);

PowerMock无法与参数类型匹配。您可以像这样显式地告诉参数类型-

ClassB classBObject = null;
boolean result = Whitebox.invokeMethod(testsubject,
        "myprivatemethod", new Class<?>[] { ClassB.class,Boolean.class},classBObject,true);
ClassB classbobObject=null;
布尔结果=Whitebox.invokeMethod(testsubject,
“myprivatemethod”,新类[]{ClassB.Class,Boolean.Class},classbobObject,true);

PowerMock无法匹配参数类型。您可以像这样显式地告诉参数类型-

ClassB classBObject = null;
boolean result = Whitebox.invokeMethod(testsubject,
        "myprivatemethod", new Class<?>[] { ClassB.class,Boolean.class},classBObject,true);
ClassB classbobObject=null;
布尔结果=Whitebox.invokeMethod(testsubject,
“myprivatemethod”,新类[]{ClassB.Class,Boolean.Class},classbobObject,true);

这两个答案对您有帮助吗?我会尽快尝试您的答案,但可能需要几天时间,直到我有时间;-)这两个答案对你有帮助吗?我会尽快尝试你的答案,但可能需要几天时间,直到我有时间;-)