You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

添加多个断言时持续出现'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_

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 12:23:15