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代码的上下文,显示bean
和validator
、Order
?
不清楚上面显示的生产代码和测试代码是如何组合在一起的。 (例如,在生产代码中没有调用 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 抛出异常测试的主要内容,如果未能解决你的问题,请参考以下文章