gpt4 book ai didi

java - Mockito Verify 方法如何工作?

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:37:13 24 4
gpt4 key购买 nike

我正在搜索如何测试某些内容是否已从数据库中正确删除,我找到了这个答案:https://stackoverflow.com/a/38082803/9115438但这让我想到,如果删除方法失败并且它实际上没有删除对象怎么办?verify 方法是只检查 delete 方法是调用了一次还是调用了一次就成功了?因为如果它不检查删除是否成功,那么该测试根本没有用。

最佳答案

你的观点是相关的。
Mockito.verify() 将仅验证在方法执行期间是否在 mock 上完成了调用。
这意味着如果模拟类的实际实现没有按预期工作,则测试无能为力。
因此,您在测试中模拟的类/方法也必须进行单一测试。
但这是否意味着 verify() 总是好的?并不真地。

假设一个测试删除某些东西的方法:

public class Foo{
MyDao myDao;

public void delete(int id){
myDao.delete(id);
}
}

测试通过:

@Mock
MyDao myDaoMock;
Foo foo;

@Test
public void delete(int id){
foo.delete(id);
Mockito.verify(myDaoMock).delete(id);
}

假设现在我将实现更改为:

public void delete(int id){
myDao.delete(id);
myDao.create(id);
}

测试仍然是绿色的...糟糕。

其他场景,假设一个主要调用依赖方法的方法:

public void doThat(){
Foo foo = fooDep.doThat(...);
Bar bar = barDep.doThat(foo);
FooBar fooBar = fooBarDep.doThat(foo, bar);
fooBis.doOtherThing(...);
// and so for
}

使用验证方法,单元测试将仅以 Mockito 格式描述/复制您方法的实现。
它不会根据返回结果断言任何内容。以错误的方式更改实现(添加不正确的调用或删除所需的调用)很难通过测试失败来检测,因为测试只是对调用语句的反射(reflect)。

Mock 验证通常是需要谨慎使用的东西。
在某些特定情况下,它可能会有帮助,但在许多情况下,我看到开发人员滥用它(75% 或更多的单元测试类是模拟设置/记录/验证),因此它会产生膨胀的单元测试几乎没有值(value),很难维护,并且由于不公平的原因也会减慢您的构建速度。
事实上,对于主要依赖具有副作用的函数的测试方法,集成测试(甚至切片/部分)应该受到青睐。


Mocks Aren't Stubs of Martin Fowler是一篇你应该感兴趣的优秀文章。

This has particularly struck me when I've observed a mockist programmer. I really like the fact that while writing the test you focus on the result of the behavior, not how it's done. A mockist is constantly thinking about how the SUT is going to be implemented in order to write the expectations. This feels really unnatural to me.

虽然这篇 Martin Fowler 的帖子很有趣,但我也不同意所有的观点。
我同意开发人员不模拟依赖项的 mockist 方法,因为依赖项很烦人,但系统地这样做通常是一个坏主意
我们应该总是有充分的理由引入模拟,例如:

  • 外部系统依赖
  • 调用缓慢
  • 可重复性问题
  • 与依赖项(输入和/或输出)交互的复杂设置

但我不同意显式创建 stub 通常是个好主意,因为编写 stub 代码需要时间,可能有错误,我们将不得不维护它。最后,为了让事情变得干净健壮, stub 类也应该进行单一测试。所有这一切都是有代价的。
另一方面,模拟库生成的模拟没有所有这些缺陷。
没有什么能阻止我们以 stub 的方式使用这些模拟:让模拟像 stub 一样协作,即:

  • 是的,用于输入/输出记录
  • yes for few and relevant verify()
  • 但没有 verify() 滥用
  • 并且没有用于将测试与实现相结合的细粒度模拟行为记录的乘法

关于java - Mockito Verify 方法如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57124928/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com