Spock 抛出异常测试

Posted

技术标签:

【中文标题】Spock 抛出异常测试【英文标题】:Spock throw exception test 【发布时间】:2014-05-10 12:32:59 【问题描述】:

我用 Spock 测试 Java 代码。我测试了这段代码:

 try 
    Set<String> availableActions = getSthAction()
    List<String> goodActions = getGoodAction()
    if (!CollectionUtils.containsAny(availableActions ,goodActions ))
       throw new CustomException();
    
 catch (AnotherCustomExceptio e) 
     throw new CustomException(e.getMessage());

我写了测试:

def "some test"() 
    given:
    bean.methodName(_) >> throw new AnotherCustomExceptio ("Sth wrong")
    def order = new Order();
    when:
    validator.validate(order )
    then:
    final CustomException exception = thrown()

它失败了,因为AnotherCustomExceptio 被抛出。但是在trycatch 块中,我捕获了这个异常并抛出了CustomException,所以我希望我的方法会抛出CustomException 而不是AnotherCustomExceptio。如何测试?

【问题讨论】:

能否展开Java代码的上下文,显示beanvalidatorOrder 不清楚上面显示的生产代码和测试代码是如何组合在一起的。 (例如,在生产代码中没有调用 bean#methodName。)很可能,异常不是从上面显示的 try 块中引发的。您应该能够在调试器中验证这一点。 你解决了吗? 不知何时”部分。你能试试吗? 【参考方案1】:

当时可能有多种处理异常的方法:

thrown(CustomException)

thrown CustomException

我们也可以检查测试用例中是否没有抛出异常 -

then:

noExceptionThrown()

【讨论】:

“doThrow”和“when”语句似乎都来自 Mockito。 Mockito 语句会与 Spock 模拟一起使用,还是必须通过 Mockito 创建模拟对象?【参考方案2】:

如果您想评估例如抛出异常的消息,您可以执行以下操作:

then:
def e = thrown(CustomException)
e.message == "Some Message"

【讨论】:

【参考方案3】:

我相信您的 then 块需要修复。试试下面的语法:

then:
thrown CustomException

【讨论】:

以上是关于Spock 抛出异常测试的主要内容,如果未能解决你的问题,请参考以下文章

Spock - 使用数据表测试异常

Laravel 测试无异常,抛出异常

如何测试该方法不会抛出异常?

如何测试 Jest 没有抛出异常?

Mockito 测试 void 方法抛出异常

PHPUnit 断言抛出异常?