假设我们要测试一个计算器程序 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 的行为。
- 在标记出 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);
}
}
网友评论