当前位置: 首页 > 面试题库 >

Mockito在异常Junit 4.10之后进行验证

薛滨海
2023-03-14
问题内容

我正在测试具有预期异常的方法。我还需要在引发异常后验证是否在某个模拟对象上调用了一些清除代码,但看起来该验证已被忽略。这是代码。我正在使用Junit
ExpectedException Rule验证预期的异常。

@Rule
public ExpectedException expectedEx = ExpectedException.none();

@Test
public void testExpectedException()
{
   MockedObject mockObj = mock(MockedObj.class);
   MySubject subject = new MySubject(mockedObj);
   expectedEx.expect(MyException.class);
   expectedEx.expectMessage("My exception message.");
   subject.someMethodThrowingException();
   verify(mockObj).
       someCleanup(eq(...));
}

似乎verify完全被忽略了。无论我采用什么方法verify,我的测试都通过了,这不是我想要的。

知道为什么会这样吗?


问题答案:

ExpectedException通过将整个测试方法通过JUnit
@Rule
包装在try-
catch块中来工作。当您的代码引发异常时,它将堆栈上移至最接近的try
/ catch,恰好在ExpectedException实例中(该实例检查您所期望的异常)。

在Java中,如果方法中发生未捕获的异常,则控制将永远不会在该方法的后面返回到语句。同样的规则也适用于此: 异常发生后,控件从不返回测试中的语句。

从技术上讲,您可以将验证放在最后一块,但这往往是个坏习惯。 编辑:
您的被测系统可能会引发意外的异常,或者根本没有异常,这将为您提供有用的故障消息和跟踪;但是,如果该失败导致您的验证或断言在该finally块中失败,那么Java将显示该消息,而不是有关意外异常或意外成功的消息。这可能会使调试变得困难,尤其是因为您的错误将来自跟随错误根源的代码行,错误地暗示其上的代码成功。

如果您确实需要在异常之后验证状态,则可以按照方法在每个方法的基础上随时返回:

@Test
public void testExpectedException()
{
  MockedObject mockObj = mock(MockedObj.class);
  MySubject subject = new MySubject(mockedObj);
  try {
    subject.someMethodThrowingException();
    fail("Expected MyException.");
  } catch (MyException expected) {
    assertEquals("My exception message.", expected.getMessage());
  }
  verify(mockObj).someCleanup(eq(...));
}

更新: 使用Java
8的lambda表达式,您可以将功能接口调用足够简洁地包装在try块中,以变得有用。我想对这种语法的支持将在许多标准测试库中找到。

assertThrows(MyException.class,
    () -> systemUnderTest.throwingMethod());


 类似资料:
  • 我正在测试一个具有预期异常的方法。我还需要验证在抛出异常后是否调用了一些清理代码(在模拟对象上),但看起来该验证被忽略了。这是代码。我正在使用 Junit 来验证预期的异常。 似乎完全被忽略了。无论我在中使用什么方法,我的测试都通过了,这不是我想要的。 你知道为什么会发生这种情况吗?

  • 在测试中,我使用的是mockobject: 我试图验证其方法的使用: 但它抛出以下异常: 组织。莫基托。例外情况。滥用。UnfinishedVerificationException:此处缺少验证(模拟)的方法调用: 这一行的例外点是: setMaxRows接受一个int。 当我注释掉这一行时,测试成功了。调试程序时,我可以看到正在设置的setMaxRows方法: BrandLabels是一个Li

  • 我对编程完全是新手,我遇到了一个问题,当我捕捉到输入失配异常时,我无法返回到主do while循环。我搜索了谷歌,但我无法找到并完全理解用户给出的解决方案。 我的目标是消除用户输入任何可能导致应用程序终止的字符的可能性。这就是为什么我用try/catch包围了几乎所有的代码。 我试图在我的代码中加入更多循环,结果都以两种方式结束: 我的循环在到达catch语句后永远不会结束 有人能解释一下我如何达

  • 我被CompletableFuture异常处理卡住了。 我的逻辑是发送电子邮件并保存此操作的状态。如果发送电子邮件抛出异常,我需要用异常消息保存状态。 处理器类目前有此代码。它工作正常,但对我来说并不优雅。我们如何摆脱用于在阶段之间共享状态的错误本地字段? 看起来句柄方法应该会有所帮助,但它返回可完成未来的可完成未来

  • 问题内容: 使用Mockito,我可以执行以下操作: 但是,如果要取而代之,我该怎么写呢?无法弄清楚如何正确编写。刚收到语法错误… 问题答案: 尝试: 实际上,当我键入IntelliJ时,它会自动建议此修复程序。不幸的是,在这种情况下,您不能使用静态导入。

  • 如何进行第三个测试来检查异常消息中原因1的存在?我还列出了前两个测试中存在的缺点。首先是不检查消息,其次需要大量样板代码。 我在Mockito中找不到一些有用的东西,但有一些东西看起来是可能的(在语法级别)和功能。 使用catchexception,我创建了这样的测试