gpt4 book ai didi

java - Junit 使用 groovy 预期异常

转载 作者:行者123 更新时间:2023-11-30 03:24:16 28 4
gpt4 key购买 nike

我有 Spring boot 应用程序。我使用 Junit+Mockito 对其进行单元测试。所有测试用例都是使用 Java 编写的。我最近决定使用 Groovy 编写测试用例,但应用程序代码仍将使用 Java。

我在测试预期异常时遇到了一个奇怪的场景。

场景 1:使用 Junit + Groovy 测试预期异常(不带 shouldFail):

    @Test(expected = NoResultException.class) 
void testFetchAllNoResultsReturned() throws Exception {
List<Name> namesLocal = null;
when(Service.fetchAllNames(id)).thenThrow(
new NoResultException(""))
namesLocal = (service.fetchAllNames(id)
assert(namesLocal==null)
verify(service, times(1)).fetchAllNames(id)
}

根据上述测试用例,service.fetchAllNames 调用应抛出 NoResultException。这方面的测试似乎效果很好。但是,之后的 assertverify 不会被调用。一旦遇到异常,方法执行就会停止。然而,我之前用 Java 编写的测试用例运行得非常好。这个问题是在我切换到 Groovy 后才发生的。

经过一些Google搜索后,我发现GroovyTestCase类提供了一个名为shouldFail的方法,它可以按照此 link 用于此场景。它确实解决了我的问题。

场景 2:使用 Junit + Groovy 测试预期异常(使用 shouldFail ):

    @Test
void testFetchAllNoResultsReturned() throws Exception {
List<Name> namesLocal = null;
when(Service.fetchAllNames(id)).thenThrow(
new NoResultException(""))
shouldFail(NoResultException.class) {
namesLocal = (Service.fetchAllNames(id)
}
assert(namesLocal==null)
verify(Service, times(1)).fetchAllNames(id)
}

我的疑问是,这是它应该如何工作的还是我错过了一些东西。如果这就是它应该如何工作的方式,那么 Groovy 这样做有什么理由吗?我尝试在互联网上查找原因,但没有找到太多线索。

最佳答案

However, the assert and verify after that are not called. As soon as the exception is encountered, the method execution stops. However, my earlier test case written in Java worked perfectly well.

给出java中的这段代码:

@Test(expected = NoResultException.class) 
void testFetchAllNoResultsReturned() throws Exception {
List<Name> namesLocal = null;
when(Service.fetchAllNames(id)).thenThrow(
new NoResultException(""))
namesLocal = (service.fetchAllNames(id)
....
}

无论 service.fetchAllNames(id) 之后有什么,调用都会抛出异常,并且测试用例将在此结束。由于您定义了预期异常,因此测试用例将通过。所以这行代码后面的assert和verify在java中永远不会被执行。

我不熟悉 groovy,但从文档看来,使用 shouldFail 的第二个示例是测试 groovy 中异常的正确方法。 shouldFail 不会终止程序 - 因此它类似于将方法调用放入 java 中的 try catch

关于java - Junit 使用 groovy 预期异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30645439/

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