[Junit]stub和mock的区别

相同点

stub和mock都是为了配合测试,对被测程序所依赖的单元的模拟。
简单说,为了测函数A,但A有引用到了函数B,通过模拟B的一些状态或行为测试A。

区别

  1. stub基于状态,mock基于行为
  2. stub难于维护
  3. mock有对本身的调用验证

stub是基于状态,mock是基于行为。
mock通常通过一些成熟的框架对类或方法进行模拟。通常的流程是:

创建指定类的mock,指定输入返回对应的响应内容。
当被测函数调用到该mock时针对输入进行预期返回。
最后验证该mock是否被调用。

而使用stub时针对每个状态,返回指定的响应。比如在Junit4 in action第6章为了测试getContent,分别模拟了几种状态:

private class TestGetContentOkHandler extends AbstractHandler {}
private class TestGetContentServerErrorHandler extends AbstractHandler {}
private class TestGetContentNotFoundHandler extends AbstractHandler {}

选择stub还是mock

其实可以看到现在mock大张旗鼓,而stub却少看到也可以看出一些差别。stub往往也要去实现处理逻辑,如果B较简单,可能直接就用实现的程序来验证了。复杂的又难于实现,用mock或许更容易些。
还有一种情况是当基于状态的实现难于模拟的时候或许有必要切换思维。毕竟,我们的目标只是为了测试被测单元。

参考

《Junit4 in action》
Martin Fowler:Mocks Aren’t Stubs
yingxysuc:初识stub和mock–junit的两种测试策略

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JUnit中使用Mock数据,可以使用Mockito这个框架。Mockito可以帮助您轻松地创建模拟对象,以便在测试中使用。 首先,您需要在项目中添加Mockito的依赖。例如,在Maven项目中,您可以在pom.xml文件中添加以下依赖: ```xml <dependency> <groupId>org.mockito</groupId> <artifactId>mockito-core</artifactId> <version>2.28.2</version> <scope>test</scope> </dependency> ``` 接下来,您可以使用Mockito中的`mock()`方法来创建模拟对象。例如: ```java List<String> mockedList = Mockito.mock(List.class); ``` 上面的代码创建了一个类型为`List<String>`的模拟对象。您可以使用这个模拟对象来模拟`List`的行为,而不需要实际创建一个`List`对象。 您还可以使用`when()`方法来指定当模拟对象的某个方法被调用时,应该返回什么值。例如: ```java when(mockedList.get(0)).thenReturn("first"); ``` 上面的代码指定当模拟的列表对象的`get(0)`方法被调用时,应该返回字符串“first”。 最后,在测试方法中使用模拟对象进行测试。例如: ```java @Test public void testMockedList() { List<String> mockedList = Mockito.mock(List.class); when(mockedList.get(0)).thenReturn("first"); assertEquals("first", mockedList.get(0)); } ``` 上面的代码测试了模拟对象的`get(0)`方法是否返回了正确的值。 总之,使用Mockito,您可以轻松地创建模拟对象,并指定它们的行为,以便进行单元测试。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值