2017-12-21 25 views
0

나는스칼라 조롱 특성은

trait Name extends Helper { 
    def name() = { 
     var s = getSystem() 
     s.name() 
    } 
} 

을 테스트하기 위해 노력하고 그 "s.name()"메서드는 인스턴스를 조롱 한 번 호출 s의 시스템입니다.

도우미 그래서 다음과 같이 정의된다

trait Helper { 
    def getSystem() : System = { 
     systemGetter.get() 
    } 
} 

은 지금부터, 내 NameSpec는 다음과 같은 :

내가 toTest에서 모의 ​​시스템을 반환하는 방법입니다에 대해 혼란 스러워요 무엇
class NameSpec extends FlatSpec with Matchers with MockitoSugar { 

    class NameImpl extends Name 
    var toTest = new NameImpl 

    val mockSystem = mock[System] 

    it should "call s.name() once" in { 
     when(getSystem() is invoked, return a mockSystem) 
     toTest.name() 
     // Verify that mockSystem.name() happened only once 
    } 
} 

. getSystem()을 호출 할 때 name()을 호출하여 시스템이 s.name()을 한 번만 호출하는지 확인할 수 있습니다. Name 특성의 name() 메서드에 대한 매개 변수 인 경우이 시스템을 쉽게 모의 할 수 있으므로 실제 시스템 대신 실제 시스템 대신 "mockSystem"을 "주입"하는 방법을 모르겠습니다.

답변

0

불행히도 코드는 컴파일 할 수 없으므로 분명히 실제로 가지고있는 것을 부적절하게 표현한 것입니다. 특히 Helper이 실제로 System 유형의 객체를 얻는 방법이 명확하지 않습니다. 나는 실제 코드에서 systemGetter을 모의해야한다고 생각하는데, Helper 특성을 구현하는 객체에 어떻게 든 주입되어 mockSystem을 반환한다고 생각합니다. 그러나 제공 한 코드를 기반으로하는 올바른 예를 보여주기가 어렵습니다. 웬일인지 이것이 당신이 할 수있는 것이 아니라면, 몇 가지 길이 있습니다.

Helper과 그 상속 주위에 케이크 패턴과 비슷한 것을 사용하는 것 같습니다. 그렇다면, 당신은 System이 주입 대신 NameImpl의 클래스를 사용할 수 있습니다

마지막으로
class NameWithInjectedSystem(val system: System) extends Name { 
    override def getSystem(): System = system 
} 

it should "call s.name() once" in { 
    val mockSystem = mock[System] 
    val nameToTest = new NameWithInjectedSystem(mockSystem) 
    val mockName = "Mock name" 

    when(mockSystem.name()).thenReturn(mockName) 
    val actual = nameToTest.name() 
    actual should === (mockName) 
    verify(mockSystem, times(1)).name() 
} 

당신도 nameToTest 객체 자체를 조롱 할 수 있지만이이보다 훨씬 더 많은 구현 세부 사항에 테스트를 결합하기 때문에 제안하려는 방법이 아니다 당신이 원하는해야 당신이 .name() 통화 thenCallRealMethod를 호출해야하고 그래서 당신이 name 또는 테스트가 작동하지 않습니다 내부의 모든 통화에 대해해야 할 방법

it should "call s.name() once" in { 
    val mockSystem = mock[System] 
    val nameToTest = mock[NameImpl] 
    when(nameToTest.getSystem()).thenReturn(mockSystem) 
    when(nameToTest.name()).thenCallRealMethod() 
    val mockName = "Mock name" 
    when(mockSystem.name()).thenReturn(mockName) 
    val actual = nameToTest.name() 
    actual should ===(mockName) 
    verify(mockSystem, times(1)).name() 
} 

참고.