[英]How to use multiple ArgumentCaptor parameter
當我使用超過1個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) {
...
}
如果我運行代碼,我會得到以下異常:
org.powermock.reflect.internal.WhiteboxImpl.getMethods(WhiteboxImpl)中org.powermock.reflect.internal.WhiteboxImpl.checkIfParameterTypesAreSame(WhiteboxImpl.java:2432)的java.lang.Class.isAssignableFrom(Native Method)中的java.lang.NullPointerException .java:1934)org.powermock.refree.internal.WhiteboxImpl.getBestMethodCandidate(WhiteboxImpl.java:1025)atg.powermock.refree.internal.WhiteboxImpl.findMethodOrThrowException(WhiteboxImpl.java:948)org.powermock.reflect。 org.powermock.reflect.internal.WhiteboxImpl.invokeMethod(WhiteboxImpl.java:859)的org.powermock.reflect.Whitebox.invokeMethod(Whitebox.java:466)中的internal.WhiteboxImpl.doInvokeMethod(WhiteboxImpl.java:882) .powermock.api.mockito.internal.expectation.PowerMockitoStubberImpl.when(PowerMockitoStubberImpl.java:106)
如果我調用一個只有一個參數的方法,即list參數一切正常。
我想你可能想用“驗證”代替什么時候。
你正在設定一個期望你的模擬“無所事事”。
調用正在測試的方法然后驗證您預期會發生什么事情並不是更好嗎?
例如,考慮這兩個類......
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"));
}
}
如果我想測試“MyClass”,我會做這樣的事......
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");
}
}
如您所見,所有這些測試方法都會調用實際代碼,然后驗證是否使用正確的參數調用了輔助類。
如果您實際上期望靜態方法調用返回一個值,該值將由您正在測試的方法的其余部分使用,那么您將需要使用“when”,但是當返回“void”時,您不需要做任何事。
一般來說,我個人避免在“when”條款中使用參數捕獲者,並將其留在“驗證”階段。
希望這可以幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.