美文网首页JUnit 学习笔记Java
JUnit4 结合 Mockito 模拟测试

JUnit4 结合 Mockito 模拟测试

作者: 专职跑龙套 | 来源:发表于2017-01-24 14:35 被阅读63次

    假设我们要测试一个计算器程序 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);
        }
    }
    

    引用:
    Mockito - JUnit Integration

    相关文章

      网友评论

        本文标题:JUnit4 结合 Mockito 模拟测试

        本文链接:https://www.haomeiwen.com/subject/aamzbttx.html