当我使用多个ArgumentCaptor参数时,我收到一个Nullpointer。可能有人知道出了什么问题吗?
@RunWith(PowerMockRunner.class)
@PrepareForTest(FileHelper.class)
public class MyTest {
...
@Before
public void setUp() throws Exception {
PowerMockito.mockStatic(FileHelper.class);
}
@Test
public void save() throws Exception {
ArgumentCaptor<String> argName = ArgumentCaptor.forClass(String.class);
ArgumentCaptor<List> argList = ArgumentCaptor.forClass(List.class);
PowerMockito.doNothing().when(FileHelper.class, "saveTextFile", argName.capture(),
argList.capture());
...
}
FileHelper类中的saveTextFile方法:
public static void saveTextFile(String filename, List<String> data) {
...
}
如果我运行代码,我会得到这个例外:
显示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) 在org.powermock.reflect.internal.WhiteboxImpl.invokeMethod(WhiteboxImpl.java:859) 在org.powermock.reflect.Whitebox.invokeMethod(Whitebox.java:466) 在org.powermock.api.mockito.internal.expectation.PowerMockitoStubberImpl.when(PowerMockitoStubberImpl.java:106)
如果我调用一个只有一个参数的方法,即list参数一切正常。
答案 0 :(得分:2)
我想你可能想用&#34;验证&#34;而不是什么时候。
您正在设定期望&#34;什么都不做&#34;在你的模拟。
最好是调用正在测试的方法,然后验证您预期会发生什么?
例如,考虑这两个类......
<强> HelperClass.java 强>
public class HelperClass {
public static void nastyStaticCall(String filename, List<String> data) {
System.out.println("REAL METHOD CALLED!!");
}
}
<强> MyClass.java 强>
import java.util.Arrays;
public class MyClass {
public void testMethod() {
HelperClass.nastyStaticCall("FILENAME", Arrays.asList("Data"));
}
}
如果我想测试&#34; MyClass&#34;,我会做这样的事情......
import static org.fest.assertions.Assertions.assertThat;
import static org.powermock.api.mockito.PowerMockito.mockStatic;
import static org.powermock.api.mockito.PowerMockito.verifyStatic;
import java.util.List;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Captor;
import org.mockito.MockitoAnnotations;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
@RunWith(PowerMockRunner.class)
@PrepareForTest(HelperClass.class)
public class MyClassTest {
private MyClass classUnderTest;
@Captor
private ArgumentCaptor<String> fileNameCaptor;
@Captor
private ArgumentCaptor<List<String>> dataCaptor;
@Before
public void setup() {
MockitoAnnotations.initMocks(this);
mockStatic(HelperClass.class);
classUnderTest = new MyClass();
}
@Test
public void shouldMakeNastyStaticCall() {
classUnderTest.testMethod();
verifyStatic();
HelperClass.nastyStaticCall(fileNameCaptor.capture(), dataCaptor.capture());
assertThat(fileNameCaptor.getValue()).isEqualTo("FILENAME");
assertThat(dataCaptor.getValue()).containsOnly("Data");
}
}
正如您所看到的,所有这些测试方法都会调用实际代码,然后验证是否使用正确的参数调用了辅助类。
如果您实际上希望静态方法调用返回一个值,该值将由您正在测试的方法的其余部分使用,那么您需要使用&#34;当&#34;时,但是这会返回& #34;无效&#34;,你不需要做任何事情。
一般来说,我个人避免在&#34;&#34;条款并将这些留给&#34;验证&#34;阶段。
希望这有帮助。