2017-11-28 10 views
0

필자의 이해에 따라 package objects에는 패키지 전체에 공통으로 사용되는 기능이 포함되어 있습니다. 아마도 이러한 기능은 나머지 코드베이스만큼 '빠르게'수정되지 않을 것입니다. 오히려 새로운 기능 만이 시간과 함께 (패키지 객체에) 추가 될 것입니다.단위 테스트 스칼라 패키지 객체

그런 다음 스칼라 패키지 객체 내에 테스트 메소드를 배치하는 것이 가치가 있습니까? 그렇다면 테스트 패키지에있는 패키지 객체 내의 클래스와 메소드에 어떻게 액세스합니까?

답변

2

당신은 일반적으로 단지 스칼라package objecttype의, val의, var들과 def의를 추가해야합니다; class es, traitobject은 동일한 package에 속하지만 별도로 정의됩니다. 이것은 전역 변수와 함수를 정의하는 수단입니다. 합니다 (자바 생태계는 정말 순수하게 글로벌 데이터와 함수의 개념을 지원하지 않기 때문에 스칼라 특별한 objectpackage 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. 
    } 
} 

는 ...

this guide 참조