2016-08-31 2 views
1

Mockito 및 Scala의 기본 매개 변수를 사용하여 일부 동작을 이해하고 싶습니다. 암시 적 기본값을 사용하여 메서드 호출 확인

trait SomeImplicit 

object SomeService { 
    val AnyImplicit = new SomeImplicit {} 
} 

trait SomeService { 
    def doWork(param: String)(implicit di: SomeImplicit = SomeService.AnyImplicit) 
} 

이의이 doWork 메소드를 호출하자 : 그것은 일하는 것이 비록 자발적으로

class SomeService$Test extends WordSpec with MockitoSugar { 
    "SomeService" should { 
    "doWork" in { 
     val dodo = mock[SomeService] 
     val expectedParameter = "ok" 

     dodo.doWork(expectedParameter) 

     verify(dodo, times(1)).doWork(expectedParameter)(SomeService.AnyImplicit) 
     verifyNoMoreInteractions(dodo) 
    } 
    } 
} 

가, 내가 가진 것

여기에 최소한의 예입니다. 그러나 그렇지 않습니다. 내가 얻을 :

Argument(s) are different! Wanted: 
someService.doWork(
    "ok", 
    [email protected] 
); 
-> at SomeService$Test$$anonfun$1$$anonfun$apply$mcV$sp$1.apply$mcV$sp(SomeService$Test.scala:25) 
Actual invocation has different arguments: 
someService.doWork(
    "ok", 
    null 
); 
-> at SomeService$Test$$anonfun$1$$anonfun$apply$mcV$sp$1.apply$mcV$sp(SomeService$Test.scala:23) 

Argument(s) are different! Wanted: 
someService.doWork(
    "ok", 
    [email protected] 
); 
-> at SomeService$Test$$anonfun$1$$anonfun$apply$mcV$sp$1.apply$mcV$sp(SomeService$Test.scala:25) 
Actual invocation has different arguments: 
someService.doWork(
    "ok", 
    null 
); 
-> at SomeService$Test$$anonfun$1$$anonfun$apply$mcV$sp$1.apply$mcV$sp(SomeService$Test.scala:23) 
+0

'DummyImplicit.dummyImplicit'의 구현을 보면'implicit def dummyImplicit : DummyImplicit = new DummyImplicit'를 볼 수 있습니다. 따라서, 호출 될 때마다 새로운 객체를 얻습니다. 'dodo.doWork (expectedParameter)', 즉'dodo.doWork (expectedParameter) (SomeService.Dummy)'를 호출 할 때 정확히 동일한 객체 ('SomeService.Dummy')를 전달해야 할 것입니다. –

+0

암시 적 매개 변수를 전달하지 않으면 스칼라가 (scala.Predef.DummyImplicit # dummyImplicit'의) 자구를 삽입합니다. –

+0

좋습니다. 잘못된 예제를 사용했습니다. 나는 그것을 미리 정의되지 않은 무언가로 업데이트했다. –

답변

0

기본 값으로 암시 적 매개 변수는 컴파일러를 알려줍니다 암시가 보통 암시 검색 과정에서 발견되지 않는 경우, 컴파일 오류를 방출하는 대신이 값을 사용합니다.

DummyImplicit은 항상 첫 번째 단계 (Predef.dummyImplicit 사용)에서 발견되므로 기본값이 사용되지 않습니다.

+0

좋아, 나는 그때 예식을 만들었다. 나는 내 질문을 DummyImplicit가 아닌 다른 것으로 업데이트 할 것이다. 그건 그렇고, 지적 해 주셔서 고마워요. –