gpt4 book ai didi

java - 如何使用多个 ArgumentCaptor 参数

转载 作者:搜寻专家 更新时间:2023-11-01 03:23:02 31 4
gpt4 key购买 nike

当我使用超过 1 个 ArgumentCaptor 参数时,我收到一个空指针。可能有人知道出了什么问题吗?

@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) at org.powermock.reflect.internal.WhiteboxImpl.invokeMethod(WhiteboxImpl.java:859) at org.powermock.reflect.Whitebox.invokeMethod(Whitebox.java:466) at org.powermock.api.mockito.internal.expectation.PowerMockitoStubberImpl.when(PowerMockitoStubberImpl.java:106)

如果我调用一个只有一个参数的方法,即列表参数,一切正常。

最佳答案

我认为您可能想使用“验证”而不是时间。

您期望在您的模拟中“什么都不做”。

调用被测试的方法,然后验证您期望发生的事情确实发生了,这不是更好吗?

例如,考虑这两个类...

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”子句中使用参数捕获器,并将它们留给“验证”阶段。

希望这对您有所帮助。

关于java - 如何使用多个 ArgumentCaptor 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24096532/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com