Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unit testing 如何在Scala中对包依赖项进行单元测试?_Unit Testing_Scala_Dependencies - Fatal编程技术网

Unit testing 如何在Scala中对包依赖项进行单元测试?

Unit testing 如何在Scala中对包依赖项进行单元测试?,unit-testing,scala,dependencies,Unit Testing,Scala,Dependencies,在我的Scala项目中,我有相当广泛和深入的类和包层次结构。显然,我希望将包的依赖性保持在最低限度 我不知道是否可以使用编译器来完成此任务, 所以我想知道如何使用单元测试来验证包的独立性? PS:由于我使用的是Scala,而不是Java,所以这种方法应该可以在字节码级别工作。这不能通过单元测试来完成,但编译器是您的朋友。使用private[PACKAGENAME]使类仅在包内可见。与Java不同,该类也将在子包中可见。这不能通过单元测试完成,但编译器是您的朋友。使用private[PACKAGE

在我的Scala项目中,我有相当广泛和深入的类和包层次结构。显然,我希望将包的依赖性保持在最低限度

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


PS:由于我使用的是Scala,而不是Java,所以这种方法应该可以在字节码级别工作。

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

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

我曾经使用过,但没有愤怒地使用它。它允许您设置包和类依赖性约束,并使用JUnit测试验证它们。它还提供了一系列功能,用于查找依赖周期、计算一系列指标,并通常保持您的体系结构干净、亮丽和新鲜。

我已经使用过,但没有愤怒地使用它。它允许您设置包和类依赖性约束,并使用JUnit测试验证它们。它还提供了一系列功能,用于查找依赖循环、计算一系列指标,并通常保持您的体系结构干净、光亮和新鲜。

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=


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=

我极力推荐。它在我的Scala/Java混合项目中非常有效。它在字节码级别工作,我从未遇到过与Scala相关的问题

在一个小的ish项目中,您可以手工编写配置文件。我们的项目很大,所以我编写了一个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]
我极力推荐。它在我的Scala/Java混合项目中非常有效。它在字节码级别工作,我从未遇到过与Scala相关的问题

在一个小的ish项目中,您可以手工编写配置文件。我们的项目很大,所以我编写了一个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]

说得好!像静态类型一样,强制执行比测试临时性更好。是的,但这只能部分解决一般情况。一个通用的依赖约束解决方案将允许表达诸如“库foo仅由包bar和baz中的类使用”和“模块bar和baz之间的所有依赖关系都是抽象的,而不是具体的”之类的需求!像静态类型一样,强制执行比测试临时性更好。是的,但这只能部分解决一般情况。一个通用的依赖约束解决方案将允许表达需求,比如“library foo仅由包bar和baz中的类使用”和“模块bar和baz之间的所有依赖都是抽象的,而不是具体的”对吧,我想我也用过一次JDepend——但这是一次可怕的经历,我记得在包名比较和部分字符串匹配方面有很多问题……对,我想我也曾经使用过JDepend——但那是一次可怕的经历,我记得很多关于包名比较和部分字符串匹配的问题…听起来很棒-我要试试这个。听起来很棒-我要试试这个。