敲碎时间的人的个人专栏
上一篇

Mockito——创建Mock

广告
选中文字可对指定文章内容进行评论啦,→和←可快速切换按钮,绿色背景文字可以点击查看评论额。
大纲

Mock创建

到目前为止,我们已经使用注解来创建Mock。 Mockito 提供了各种方法来创建模拟对象。 mock() 创建模拟,而不用担心Mock将在适当的时候进行的方法调用的顺序。

创建语法:

calcService = mock(CalculatorService.class);

我们再来看看一个具体的例子:

// @RunWith attaches a runner with the test class to initialize the test data
@RunWith(MockitoJUnitRunner.class)
public class MathApplicationTester {
	
   private MathApplication mathApplication;
   private CalculatorService calcService;

   @Before
   public void setUp(){
      mathApplication = new MathApplication();
      calcService = mock(CalculatorService.class);
      mathApplication.setCalculatorService(calcService);
   }

   @Test
   public void testAddAndSubtract(){

      //add the behavior to add numbers
      when(calcService.add(20.0,10.0)).thenReturn(30.0);

      //subtract the behavior to subtract numbers
      when(calcService.subtract(20.0,10.0)).thenReturn(10.0);

      //test the subtract functionality
      Assert.assertEquals(mathApplication.subtract(20.0, 10.0),10.0,0);

      //test the add functionality
      Assert.assertEquals(mathApplication.add(20.0, 10.0),30.0,0);

      //verify call to calcService is made or not
      verify(calcService).add(20.0,10.0);
      verify(calcService).subtract(20.0,10.0);
   }
}

以上代码通过在其中注入一个calculatorService 的模拟来测试MathApplication 类。 Mock 将由 Mockito 创建。 在这里,我们通过 when() 向模拟对象添加了两个模拟方法调用 add() 和减法()。然而,在测试期间,我们在调用 add() 之前调用了 subtract()。当我们使用 create() 创建模拟对象时,方法的执行顺序无关紧要。

下面我们再说说

有序验证

Mockito 提供了 Inorder 类,该类负责处理模拟将在适当的时候进行的方法调用的顺序。

语法:

//create an inOrder verifier for a single mock
InOrder inOrder = inOrder(calcService);

//following will make sure that add is first called then subtract is called.
inOrder.verify(calcService).add(20.0,10.0);
inOrder.verify(calcService).subtract(20.0,10.0);

我们还是用一个例子来说明

// @RunWith attaches a runner with the test class to initialize the test data
@RunWith(MockitoJUnitRunner.class)
public class MathApplicationTester {
	
   private MathApplication mathApplication;
   private CalculatorService calcService;

   @Before
   public void setUp(){
      mathApplication = new MathApplication();
      calcService = mock(CalculatorService.class);
      mathApplication.setCalculatorService(calcService);
   }

   @Test
   public void testAddAndSubtract(){

      //add the behavior to add numbers
      when(calcService.add(20.0,10.0)).thenReturn(30.0);

      //subtract the behavior to subtract numbers
      when(calcService.subtract(20.0,10.0)).thenReturn(10.0);

      //test the add functionality
      Assert.assertEquals(mathApplication.add(20.0, 10.0),30.0,0);

      //test the subtract functionality
      Assert.assertEquals(mathApplication.subtract(20.0, 10.0),10.0,0);

      //create an inOrder verifier for a single mock
      InOrder inOrder = inOrder(calcService);

      //following will make sure that add is first called then subtract is called.
      inOrder.verify(calcService).subtract(20.0,10.0);
      inOrder.verify(calcService).add(20.0,10.0);

   }
}

我们通过在其中注入一个calculatorService 的模拟来测试MathApplication 类。 Mock 将由 Mockito 创建。

在这里,我们通过 when() 向模拟对象添加了两个模拟方法调用 add() 和减法()。然而,在测试期间,我们在调用 add() 之前调用了 subtract()。当我们使用 Mockito 创建模拟对象时,方法的执行顺序无关紧要。使用 InOrder 类,我们可以确保调用顺序。

注意,在这里我特意打乱了顺序,让测试不通过,这样来验证InOrder inOrder = inOrder(calcService)这个功能的作用。

版权声明:著作权归作者所有。

X

欢迎加群学习交流

联系我们