添加多个断言时持续出现'Unused expression without side effects'警告的解决办法
解决Scala测试中“Unused expression without side effects”警告
这个警告是因为Scala编译器把每个独立的断言当成了无副作用的未使用表达式——虽然测试框架会执行断言并在失败时抛出异常,但编译器识别不到这些断言的“副作用”,所以触发了警告。下面是几种实用的解决方法:
方法1:组合断言为单个表达式
如果你的测试方法定义为返回Assertion(比如ScalaTest的AnyWordSpec风格),用&&把多个断言拼起来,让编译器认为这是一个有用的整体表达式:
val result = borrowingService.transform(input) val overview = result.openAccounts.head (overview.accountType shouldBe "CreditCard") && (overview.totalBalance shouldBe SummaryMonetaryAmount(4000, 2, "GBP")) && (overview.totalLimit shouldBe SummaryMonetaryAmount(12000, 2, "GBP")) && (overview.totalUtilisation shouldBe Some(33))
方法2:用测试框架的聚合断言工具
ScalaTest提供了assertAll方法,专门用来批量执行断言,既能聚合结果,又能避免编译器警告:
import org.scalatest.Assertions.assertAll val result = borrowingService.transform(input) val overview = result.openAccounts.head assertAll( overview.accountType shouldBe "CreditCard", overview.totalBalance shouldBe SummaryMonetaryAmount(4000, 2, "GBP"), overview.totalLimit shouldBe SummaryMonetaryAmount(12000, 2, "GBP"), overview.totalUtilisation shouldBe Some(33) )
方法3:把断言放在代码块里
如果测试方法返回Unit,把所有断言塞进一个大括号块里就行,编译器会把整个块当成一个有意义的执行单元:
val result = borrowingService.transform(input) val overview = result.openAccounts.head { overview.accountType shouldBe "CreditCard" overview.totalBalance shouldBe SummaryMonetaryAmount(4000, 2, "GBP") overview.totalLimit shouldBe SummaryMonetaryAmount(12000, 2, "GBP") overview.totalUtilisation shouldBe Some(33) }
方法4:禁用特定警告(不推荐)
如果上面的方法都不适合你,可以在项目编译配置里关掉这个警告,但这会屏蔽其他可能有用的未使用表达式提示,所以只建议作为最后的选择:
在sbt的build.sbt里添加:
scalacOptions += "-Wunused:no-expr"
内容的提问来源于stack exchange,提问作者clive_
相关产品推荐
相关产品推荐

