[英]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.