簡體   English   中英

單元測試 Scala 包對象

[英]Unit testing Scala package object

根據我的理解, package objects包含整個包中使用的通用功能。 據推測,這些功能沒有像代碼庫的其余部分那樣“快速”地修改。 相反,隨着時間的推移,只會添加新功能(到包對象)。

那么是否值得在 Scala 包對象中對方法進行單元測試? 如果是,那么如何訪問測試包中包對象內的類和方法?

您通常應該只將type s、 val s、 var s 和def s 添加到Scala package object class es, trait s 和object s 將屬於同一個package ,但它們是分開定義的。 它是一種定義全局變量和函數的方法。 (Java生態系統真的不支持純粹的全局數據和函數的概念,所以斯卡拉使他們在一個特殊的object稱為package object 。)

例如,假設您正在為三角運算設計一個包,您可能有一個定義如下的包對象:

/** My trig library. */
package object trig {

  /** Type used to represent an angle in radian measure. */
  type Angle = Double

  /** Value of PI circle constant. */
  val PI = 3.141592653589793

  /** Calculate angle with specified `opposite` and `adjacent` length values.
   *  @param opposite Length of side opposite the angle in a right-angled triangle.
   *  @param adjacent Length of the side adjacent to the angle in a right-angled triangle.
   *  @return Angle in radians for specified `opposite` and `adjancent` values.
   */
  def atan2(opposite: Double, adjacent: Double): Angle = {
    // Etc...
  }

  // Etc...
}

庫中的任何類都將在同一個包中定義,但作為單獨的元素(通常也在單獨的文件中)。 例如:

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 object的內容時,您只需像在常規代碼中一樣引用它們。 從同一包中的代碼中,您只需引用元素的名稱; 否則,您需要使用包作為元素名稱的前綴。 例如:

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/斯卡拉主分支。

假設您在主分支中有一個名為com.scala.classes.A的包,其中有一個包對象 A 有一個方法 b,並且您在同一個包中有一個類 C。 在常規分支中,類 C 可以直接從其代碼的任何位置直接調用方法 b。 但是,在我的測試代碼中,在創建了一個名為 myC 的 C 類型對象后,我無法通過引用 myC.b(它不可見)來調用包對象 A 的方法 b,那么如何引用它呢?

答案是,您所要做的就是像導入普通對象一樣導入包對象:

導入 com.scala.classes.A

然后簡單地打電話

抗體

測試方法b

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM