1.概述

在这个快速的教程中,我们将了解Mockito金宝搏官网188be不必要的司布bing克奇奇。此异常是在错误地使用存根时会遇到的常见异常之一。

我们将首先解释严格的存根背后的哲学,为什么Mockito默认鼓励其使用。接下来,我们将立即查看此异常的意义,在哪种情况下发生。要结束,我们将看到我们如何在我们的测试中抑制此异常的示例。

要了解有关Mockito测试金宝搏官网188be的更多信息,请查看我们的全面Mockito系列

2.严格的短管

使用Mockito的1.x版本,可以使用没有任何限制的模型来配置和交互。这意味着,随着时间的推移,测试通常会变得超越,有时更难调试。

自版本2. +,Mockito一直在推出新的功能,使框架成为“严格”。这背后的主要目标是:

  • 在测试代​​码中检测未使用的存根
  • 减少测试代码复制和unNEERRARE测试代码
  • 通过删除'死'代码来促进清洁测试
  • 帮助提高调试和生产力

以下原则可帮助我们通过消除不必要的测试代码来创建清洁测试。它们还有助于避免复制粘贴错误以及其他开发人员的监督。

总而言之,严格的短管报告不必要的存根,检测存根参数不匹配并使我们的测试更干燥(不要重复自己)。这有助于A.清洁和可维护的Codebase。

2.1。配置严格的存根

自模托2. +,默认情况下,使用以下任一项方式初始化我们的模型时使用严格的存根

  • Mockitojunitrunner.
  • mockitojunit.rule()

Mockito强烈建议使用上述任何一个。但是,当我们没有利用Mockito规则或跑步者时,还可以另一种方法可以在我们的测试中进行严格存根:

mockito.mockitosession().initmocks(此).strictness(strictness.strict_stubs).startmocking();

最后一个重要的要点是,在Mockito 3.0中,所有括号都将是“严格”并默认验证。

3.不必要的司布bing克奇奇例子

简单地说,不必要的存根是在测试执行期间从未实现过的存根方法调用。

让我们来看看一个简单的例子:

@test public void gentuusedstub_whenvokingththenthrowunneetarystubbingexpection(){何​​时(mocklist.add(“一个”))。然后return(true);//这不会被叫(mocklist.get(anyint()))。然后return(“hello”);assertequals(“名单应该包含hello”,“hello”,mocklist.get(1));}

当我们运行此单元测试时,Mockito将检测未使用的存根并抛出不必要的司布bing克奇奇

org.mockito.Exceptions.misusing.UneNENTARESTUBBINGEXEXCEPTION:未检测到不必要的发短管。清洁和可维护的测试代码需要零不必要的代码。不需要括号以下(点击以导航到相关的代码行):1。 - >在com.baeldung.mockito.misusing.giventUnusedStub_WhenInvokingGetthen金宝搏188体育tStub_WhenInvokingGetthentStub_WhenInvokingGethunittest.java:37)请删除不必要的罚球或使用“宽松”的严格。更多信息:javadoc for UnnedaryStubbingException类。

值得庆幸的是,从错误消息中很清楚,问题在这里有什么问题。我们还可以看到异常消息甚至指向我们导致错误的确切行。

为什么会发生这种情况?好吧,第一个什么时候调用配置我们的模拟返回真的当我们打电话的时候添加论证的方法“一”。但是,我们在单元测试执行的其余部分期间,我们不再调用此方法。

Mockito告诉我们我们的第一个什么时候行是冗余的,也许我们在配置短存款时会出现错误。

虽然这个例子是微不足道的,但很容易想象当嘲笑一个复杂的对象层次结构时,这种消息如何帮助调试,否则非常有用。

4.绕过严格的短管

最后,让我们看看如何绕过严格的存根。这也被称为延伸存根。

有时我们需要配置特定的存根,同时维护所有其他的托管和模型以使用严格的存根:

@test public void gendlenientdstub_whenvokinggetthenthrowunneetarystubbingexception(){lenient()。什么时候(mocklist.add(“一个”))。然后return(true);什么时候(mocklist.get(anyint()))。然后return(“hello”);assertequals(“名单应该包含hello”,“hello”,mocklist.get(1));}

在上面的例子中,我们使用静态方法mockito.lenient()使宽松的存根添加我们模拟列表的方法。

宽松的存根绕过“严格的短扣”验证规则。例如,当短声被声明为宽度时,不会检查潜在的短扣问题,例如前面描述的不必要的存根。

结论

在这篇简短的文章中,我们首先通过在Mockito中引入严格的破碎概念,并理解为什么它被介绍的哲学以及为什么重要。

接下来,我们看了一个例子不必要的司布bing克奇奇在完成测试中如何在我们的测试中启用Lenient Stubbing之前完成。

与始终一样,文章的完整源代码可供选择GitHub.

通用底部

使用Spring 5和Spring Boot 2开始,通过学习春天课程:

>>查看课程
评论在本文上关闭!