假设我们要测试一个计算器程序 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),我们将立即处理。