如何在Scala中单元测试包依赖项?

时间:2010-12-12 13:27:14

标签: unit-testing scala dependencies

在我的Scala项目中,我有一个广泛的&深层次的类和包。显然,我希望将软件包的依赖性保持在最低限度。

我不知道我是否可以使用编译器, 所以我想知道如何使用单元测试来验证包的独立性?

PS:由于我使用的是Scala而不是Java,因此该方法可能适用于字节码级别。

4 个答案:

答案 0 :(得分:3)

这不能用单元测试来完成,但编译器在这里是你的朋友。使用私有[PACKAGENAME]使类仅在包内可见。与Java不同,该类也将在子包中可见。

答案 1 :(得分:1)

我和JDepend一起玩过,但没有在愤怒中使用它。它允许您设置包和类依赖性约束,并使用JUnit测试验证它们。它还具有一系列功能,可用于查找依赖关系周期,计算一系列指标,并通常使您的架构保持干净,闪亮和新鲜。

答案 2 :(得分:1)

scala编译器可以为您生成依赖关系图,然后您可以使用自制工具进行检查。以下是你如何称呼它:

scalac -make:transitive -dependencyfile dep.txt *.scala

它产生了什么:

.;C:\Progra~2\Java\jre6\lib\ext\QTJava.zip;C:\Program Files (x86)\Java\jre6\lib\ext\QTJava.zip
-------
Aposta.scala -> Aposta.scala
Aposta.scala -> Premio.scala
Aposta.scala -> Bilhete.scala
Premio.scala -> Premio.scala
Premio.scala -> Sorteio.scala
Bilhete.scala -> Aposta.scala
Bilhete.scala -> Bilhete.scala
Bilhete.scala -> Sorteio.scala
Browser.scala -> Browser.scala
Megasena.scala -> Browser.scala
Megasena.scala -> Bilhete.scala
Megasena.scala -> Sorteio.scala
Megasena.scala -> Megasena.scala
Sorteio.scala -> Premio.scala
Sorteio.scala -> Sorteio.scala
-------
Aposta.scala -> megasena\Aposta$.class
Aposta.scala -> megasena\Aposta$$anonfun$1.class
Aposta.scala -> megasena\Aposta$$anonfun$toString$1.class
Aposta.scala -> megasena\Aposta$$anonfun$toString$2.class
Aposta.scala -> megasena\Aposta.class
Premio.scala -> megasena\Premio$.class
...

此外,sbt会自动执行此操作(在目标目录中查找名为analysis/dependencies的文件以及analysis/external)。这就是他们的样子:

#Source Dependencies
#Mon Jan 04 18:31:56 BRST 2010
Sorteio.scala=Megasena.scala;Premio.scala;Bilhete.scala
Premio.scala=Sorteio.scala;Aposta.scala
Browser.scala=Megasena.scala
Aposta.scala=Bilhete.scala
Bilhete.scala=Megasena.scala;Aposta.scala
Megasena.scala=
RedBlackTree.scala=

#External Dependencies
#Mon Jan 04 18:31:56 BRST 2010
C\:\\Workset\\megasena\\project\\boot\\scala-2.7.4\\lib\\scala-library.jar=Browser.scala;RedBlackTree.scala;Premio.scala
;Bilhete.scala;Sorteio.scala;Megasena.scala;Aposta.scala
C\:\\Arquivos\ de\ programas\\Java\\jdk1.6.0_16\\jre\\lib\\rt.jar=Browser.scala;RedBlackTree.scala;Premio.scala;Bilhete.
scala;Sorteio.scala;Megasena.scala;Aposta.scala

答案 3 :(得分:1)

我强烈推荐Classycle。它在我的混合Scala / Java项目中运行良好。它在字节码级别工作,我从未遇到过与Scala相关的问题。

在小型项目中,您可以手动编写配置文件。我们的项目很大,所以我编写了一个生成配置文件的Scala脚本。每个包生成的文件部分如下所示:

[agent] = org.nlogo.agent.* excluding org.nlogo.agent.*.*
[agent+] = [agent] [api+]
[agent-] = org.nlogo.* excluding [agent+]
check [agent] independentOf [agent-]

这表示org.nlogo.agent可能依赖于org.nlogo.api(并且在org.nlogo.api允许的依赖项上递归),但是没有其他包。

您还可以编写检查外部依赖关系的规则,例如这是我如何检查我们只依赖某些特定包的JOGL:

[JOGL-free-zone] = org.nlogo.* excluding [gl.render] [gl.view]
[JOGL] = net.java.games.* javax.media.opengl.*
check [JOGL-free-zone] independentOf [JOGL]