JUnit4 结合Mockito模拟测试

发表于:2018-1-25 15:34

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:专职跑龙套    来源:简书

  假设我们要测试一个计算器程序 CalculatorApplication,但是该程序依赖于 CalculatorService 实现具体的计算过程。
  代码如下:
public interface CalculatorService {
public double add(double input1, double input2);
public double subtract(double input1, double input2);
public double multiply(double input1, double input2);
public double divide(double input1, double input2);
}
public class CalculatorApplication {
private CalculatorService calcService;
public void setCalculatorService(CalculatorService calcService) {
this.calcService = calcService;
}
public double add(double input1, double input2) {
return calcService.add(input1, input2);
}
public double subtract(double input1, double input2) {
return calcService.subtract(input1, input2);
}
public double multiply(double input1, double input2) {
return calcService.multiply(input1, input2);
}
public double divide(double input1, double input2) {
return calcService.divide(input1, input2);
}
}
  问题来了:在测试时,我们可能并没有 CalculatorService 这个接口的具体实现类,例如 CalculatorServiceImpl。
  因此我们需要在测试时模拟 CalculatorService 这个接口的行为。
  此时我们使用 mockito 来模拟行为。
  mockito 可以通过注解的方式来使用:
  @RunWith(MockitoJUnitRunner.class):指定 Test Runner
  @InjectMocks:Mark a field on which injection should be performed. 标识一个变量,该变量会被注入一个 Mock。例如 CalculatorApplication 会被注入一个 CalculatorService 的实现。
  注意:CalculatorApplication 中需要定义一个 set 方法来注入。
  @Mock:Mark a field as a mock. 标识一个变量,该变量会被 Mock。例如 CalculatorService 。
  在标记出 Mock 后,可以通过 when 来模拟该 Mock 的行为。
  示例如下:
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import static org.mockito.Mockito.when;
@RunWith(MockitoJUnitRunner.class)
public class Mockito_Test {
@InjectMocks
CalculatorApplication calculatorApplication = new CalculatorApplication();
@Mock
CalculatorService calcService;
@Test
public void testAdd() {
// 模拟 CalculatorService 的行为
when(calcService.add(10.0, 20.0)).thenReturn(30.00);
// 测试
Assert.assertEquals(calculatorApplication.add(10.0, 20.0), 30.0, 0);
}
}

上文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8017),我们将立即处理。
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号