问题描述
我一直在为我的团队开发一个通用库,我需要在其中为最终用户提供模拟数据来编写单元测试代码。理想情况下,模拟对象应该只可用于引用我的包的测试,但我不确定如何执行此操作。
我的包结构是:
├── common
│ ├── src
│ │ ├── main
│ │ │ ├── resources
│ │ │ └── scala
│ │ └── test
│ │ ├── resources
│ │ └── scala
│ │ └── MockData.scala // <--- object defined here
├── build.sbt
在我的 build.sbt 中,我有
Test / publishArtifact := true
Test / publish := true
packageBin / publishArtifact := true
我使用 sbt clean; sbt compile; sbt publishLocal
在本地发布我的库。
在引用上述库的项目中,我在 build.sbt 中添加了以下内容:
ThisBuild / libraryDependencies ++= Seq(
"org.my" %% "common" % "0.0.1","org.my" %% "common" % "0.0.1" % Test,)
但是在编写测试时,我找不到 MockData.scala 中定义的对象。
请提供一些提示,非常感谢。
------------------- 更新 ------------------
在谷歌搜索之后,我决定编写一个单独的模块来仅发布测试数据。所以我的包结构变成了:
├── common
│ ├── src
│ │ ├── main
│ │ │ ├── resources
│ │ │ └── scala
│ │ └── test
│ │ ├── resources
│ │ └── scala
├── common-testkit
│ ├── src
│ │ └── main
│ │ ├── resources
│ │ └── scala
│ │ └── MockData.scala // <--- object defined here
├── build.sbt
解决方法
问题在于您要求检索其他项目中的测试代码的方式。
"org.my" %% "common" % "0.0.1" % Test
表示在运行其他项目的测试时依赖于项目的“主”代码。这就是范围 Test
(在版本之后)的含义。
您想要的是在运行测试时依赖于公共项目的“测试代码”。这是通过在 sbt 中指定所谓的“分类器”来完成的:
"org.my" %% "common" % "0.0.1" % Test classifier "tests"