摘要:假设我们要测试一个计算器程序 CalculatorApplication,但是该程序依赖于 CalculatorService 实现具体的计算过程。
JUnit4 结合Mockito模拟测试
假设我们要测试一个计算器程序 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); } }
本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标软件测试之测试工具频道!
您输入的评论内容中包含违禁敏感词
我知道了
请输入正确的手机号码
请输入正确的验证码
您今天的短信下发次数太多了,明天再试试吧!
我们会在第一时间安排职业规划师联系您!
您也可以联系我们的职业规划师咨询:
版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
沪公网安备 31011502005948号