Junit使用groovy预期的异常

时间:2015-06-04 13:42:29

标签: java unit-testing groovy junit

我有Spring启动应用程序。我使用Junit + Mockito进行单元测试。所有测试用例都是用Java编写的。我最近决定使用Groovy编写测试用例,尽管应用程序代码将保留在Java中。

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

场景1:使用Junit + Groovy(没有shouldFail)测试预期的异常:

int

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

在进行一些Google搜索后,我发现 GroovyTestCase 类提供了一种名为 shouldFail 的方法,该方法可以按照此link用于此方案。它确实解决了我的问题。

场景2:使用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)
    }

我怀疑的是,这是应该如何工作还是我错过了什么。如果这是它应该如何工作,那么Groovy背后是否有任何理由这样做?我试图在互联网上寻找原因但我无法获得很多线索。

1 个答案:

答案 0 :(得分:2)

  

但是,之后的断言和验证不会被调用。一旦遇到异常,方法执行就会停止。但是,我早期用Java编写的测试用例运行得非常好。

在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)之后拥有什么,调用都将抛出异常,测试用例结束。由于您定义了预期的异常,因此测试用例将通过。因此,在这行代码之后的断言和验证永远不会在java中执行。

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