前言
针对同一方法多次被调用且不同入参需要Mock
不同出参的情况,可以使用Answer
。本篇文章将对Answer
的使用进行说明。关于使用PowerMock
需要引入哪些依赖,请参考PowerMock使用-依赖准备。
正文
被测试类如下所示。
public class AnswerHelp {
public String convert(int num) {
return StringUtils.EMPTY;
}
}
测试类如下所示。
@RunWith(PowerMockRunner.class)
@PrepareForTest(AnswerHelp.class)
public class PowerMockTest {
@Test
public void answer() {
AnswerHelp answerHelp = PowerMockito.mock(AnswerHelp.class);
Answer<String> answer = new Answer<String>() {
@Override
public String answer(InvocationOnMock invocation) {
int num = (Integer) invocation.getArguments()[0];
if (num == 0) {
return "zero";
} else if (num == 1) {
return "one";
}
return StringUtils.EMPTY;
}
};
PowerMockito.when(answerHelp.convert(anyInt())).thenAnswer(answer);
assertThat(answerHelp.convert(0), is("zero"));
assertThat(answerHelp.convert(1), is("one"));
}
}
其中Answer
的泛型类型需要与answer()
方法的返回值类型一致,且通过InvocationOnMock
的getArguments()
可以获取mock实例调用的方法所有入参,callRealMethod()
可以调用真实方法,getMethod()
可以获取mock实例调用的方法,getMock()
可以获取mock实例。同时,还可以使用org.mockito.BDDMockito.given
来实现相同的效果,如下所示。
public class AnswerHelp {
public String convert(int num) {
return StringUtils.EMPTY;
}
}
@RunWith(PowerMockRunner.class)
@PrepareForTest(AnswerHelp.class)
public class PowerMockTest {
@Test
public void answer() {
AnswerHelp answerHelp = PowerMockito.mock(AnswerHelp.class);
Answer<String> answer = new Answer<String>() {
@Override
public String answer(InvocationOnMock invocation) {
int num = (Integer) invocation.getArguments()[0];
if (num == 0) {
return "zero";
} else if (num == 1) {
return "one";
}
return StringUtils.EMPTY;
}
};
given(answerHelp.convert(anyInt())).willAnswer(answer);
assertThat(answerHelp.convert(0), is("zero"));
assertThat(answerHelp.convert(1), is("one"));
}
}