Scala包对象的单元测试

Scala包对象的单元测试,scala,unit-testing,package,Scala,Unit Testing,Package,据我所知,包对象包含整个包使用的通用功能。据推测,这些功能的修改速度不如代码库的其他部分快;相反,随着时间的推移,只会(向包对象)添加新功能 那么,在Scala包对象中进行单元测试方法是否值得呢? 如果是,那么如何访问测试包中包对象内部的类和方法?您通常只应将类型s、vals、vars和defs添加到Scala包对象类es、特征s和对象s将属于相同的包,但它们是单独定义的。它是定义全局变量和函数的一种方法。(Java生态系统并不真正支持纯全局数据和函数的概念,因此Scala将它们放在一个特殊的对

据我所知,
包对象
包含整个包使用的通用功能。据推测,这些功能的修改速度不如代码库的其他部分快;相反,随着时间的推移,只会(向包对象)添加新功能

那么,在Scala包对象中进行单元测试方法是否值得呢?
如果是,那么如何访问测试包中包对象内部的类和方法?

您通常只应将
类型
s、
val
s、
var
s和
def
s添加到Scala
包对象
<代码>类es、
特征
s和
对象
s将属于相同的
,但它们是单独定义的。它是定义全局变量和函数的一种方法。(Java生态系统并不真正支持纯全局数据和函数的概念,因此Scala将它们放在一个特殊的
对象中,称为
包对象

例如,假设您正在为三角运算设计一个包,您可能会定义一个包对象,如下所示:

库中的任何类都将在同一个包中定义,但作为单独的元素(通常也在单独的文件中)。例如:

package trig

/** A point in 2D space.
 *
 *  @param x X-axis co-ordinate of this point.
 *  @param y Y-axis co-ordinate of this point.
 */
case class Point(x: Double, y: Double)
就测试而言,相关代码被修改的频率不应决定您是否为该代码编写测试。相反,您应该考虑代码无效的后果。在本例中,编写一个测试来验证
trig.PI
是否具有正确的值可能是一个好主意(防止有人意外或故意修改其值),即使该值永远不会更改。类似地,您可能希望为
trig.atan2
函数编写测试用例。(例如,当传递两个
0.0
参数值时,它返回什么,等等)

测试
包对象的内容时,只需像在常规代码中一样引用它们。从同一个包中的代码中,只需引用元素的名称;否则,您将需要在包中添加元素名称的前缀。例如:

package trig

import org.scalatest.FunSpec

class PackageTest
extends FunSpec {

  describe("trig global elements") {

    // Test value of PI.
    describe("PI") {
      it("must have the correct value") {
        assert(PI === 3.141592653589793")
      }
    }

    // Test atan2 function.
    describe("atan2") {

      it("must return an angle of 0.0 radians if opposite and adjacent are both 0.0") {
        assert(atan2(0.0, 0.0) === 0.0)
      }

      // Etc.
    }

    // Etc.
  }
}

有关更多信息,请参阅…

您通常只应将
类型
s、
val
s、
var
s和
def
s添加到Scala
包对象
<代码>类
es、
特征
s和
对象
s将属于相同的
,但它们是单独定义的。它是定义全局变量和函数的一种方法。(Java生态系统并不真正支持纯全局数据和函数的概念,因此Scala将它们放在一个特殊的
对象中,称为
包对象

例如,假设您正在为三角运算设计一个包,您可能会定义一个包对象,如下所示:

库中的任何类都将在同一个包中定义,但作为单独的元素(通常也在单独的文件中)。例如:

package trig

/** A point in 2D space.
 *
 *  @param x X-axis co-ordinate of this point.
 *  @param y Y-axis co-ordinate of this point.
 */
case class Point(x: Double, y: Double)
就测试而言,相关代码被修改的频率不应决定您是否为该代码编写测试。相反,您应该考虑代码无效的后果。在本例中,编写一个测试来验证
trig.PI
是否具有正确的值可能是一个好主意(防止有人意外或故意修改其值),即使该值永远不会更改。类似地,您可能希望为
trig.atan2
函数编写测试用例。(例如,当传递两个
0.0
参数值时,它返回什么,等等)

测试
包对象的内容时,只需像在常规代码中一样引用它们。从同一个包中的代码中,只需引用元素的名称;否则,您将需要在包中添加元素名称的前缀。例如:

package trig

import org.scalatest.FunSpec

class PackageTest
extends FunSpec {

  describe("trig global elements") {

    // Test value of PI.
    describe("PI") {
      it("must have the correct value") {
        assert(PI === 3.141592653589793")
      }
    }

    // Test atan2 function.
    describe("atan2") {

      it("must return an angle of 0.0 radians if opposite and adjacent are both 0.0") {
        assert(atan2(0.0, 0.0) === 0.0)
      }

      // Etc.
    }

    // Etc.
  }
}

有关更多信息,请参阅…

此答案仅回答“如何访问测试包中包对象内部的类和方法?”

好的,我有以下场景:我试图弄清楚如何从Junit测试类中引用包对象,这些类位于src/test/scala测试分支中,而包对象位于src/main/scala主分支中

假设在主分支中有一个名为com.scala.classes.a的包,其中有一个包对象a,其中有一个方法b,在同一个包中有一个类C。在常规分支中,类C可以直接从其代码中的任何位置调用方法b。然而,在我的测试代码中,在创建了一个名为myC的C类型对象之后,我无法通过引用myC.b(它不可见)来调用包对象A的方法b,那么如何引用它呢

答案是,您所要做的就是像导入常规对象一样导入包对象:

导入com.scala.classes.A

然后简单地打电话

A.b


要测试方法b

这个答案只回答了“如何访问测试包中包对象内部的类和方法?”

好的,我有以下场景:我试图弄清楚如何从Junit测试类中引用包对象,这些类位于src/test/scala测试分支中,而包对象位于src/main/scala主分支中

假设在主分支中有一个名为com.scala.classes.a的包,其中有一个包对象a,其中有一个方法b,在同一个包中有一个类C。在常规分支中,类C可以直接从其代码中的任何位置调用方法b。然而,在我的测试代码中,在创建了一个名为myC的C类型对象之后,我无法调用方法