복붙노트

[SCALA] 어떻게 스칼라에서 기능을 인수하는 방법을 조롱하는?

SCALA

어떻게 스칼라에서 기능을 인수하는 방법을 조롱하는?

나는 전화 별 이름 인수를 취하는 메소드 호출을 조롱하기 위해 노력하고있어 :

import org.scalatest.WordSpec
import org.scalatest.mock.MockitoSugar
import org.mockito.Mockito._
import org.junit.runner.RunWith
import org.scalatest.junit.JUnitRunner

trait Collaborator {
   def doSomething(t: => Thing)
}

trait Thing

@RunWith(classOf[JUnitRunner])
class Test extends WordSpec with MockitoSugar {
   "The subject under test" should {
      "call the collaborator" in {
         // setup
         val m = mock[Collaborator]
         val t = mock[Thing]

         // test code: this would actually be invoked by the SUT
         m.doSomething(t)

         // verify the call
         verify(m).doSomething(t)
      }
   }
}

나는 주로 내가 사용하고있는 무슨이의 이후 Mockito에 관심이 있어요,하지만 난 주요 모의 프레임 워크의 테스트 이런 종류의 할 수 있는지 여부를 확인 싶네. 테스트 오류 등으로 검증 라인 런타임 실패

내가 정확하게 상황을 이해 해요 경우, 컴파일러는 암시 적으로 반환 t 그 인수 없음 기능에 t을 포장한다. 모의 워크 후 동등한 테스트 코드에서 제조 한, 해당 기능을 비교하지만 동일된다 ().

내 경우는 문제의 비교적 간단한 버전입니다,하지만 난이 어떤 고차 기능에 문제가 될 것이라고 생각합니다.

해결법

  1. ==============================

    1.이 추한 모습, 그러나 희망은 좋은 해결책을 찾기 위해 당신을 도울 수 있습니다 :

    이 추한 모습, 그러나 희망은 좋은 해결책을 찾기 위해 당신을 도울 수 있습니다 :

    import org.scalatest.mock.MockitoSugar
    import org.mockito.Mockito._
    
    trait Collaborator {
       def doSomething(t: => Thing)
    }
    
    trait Thing
    
    new MockitoSugar {
         // setup
         val m = mock[Collaborator]
         val t = mock[Thing]
    
         m.doSomething(t)
    
         classOf[Collaborator].getMethod("doSomething", classOf[Function0[_]]).invoke(
            verify(m), 
            new Function0[Thing] { 
                def apply() = null
                override def equals(o: Any): Boolean = t == o.asInstanceOf[Function0[Thing]].apply() 
          })
    }
    
  2. ==============================

    2.이 문제는 사용자가 명시 적 FunctionX 개체에 일치시킬 수 있습니다 정기적 높은 순서 기능에 의해 이름 호출에 고유 한 것 같다 :

    이 문제는 사용자가 명시 적 FunctionX 개체에 일치시킬 수 있습니다 정기적 높은 순서 기능에 의해 이름 호출에 고유 한 것 같다 :

    확인 (협력자) .somethingElse (임의 (기능 2 [문자열 것]))

    바이 이름 경우에 Function0에 인수의 포장 암시 적으로 수행되며, 알렉세이의 대답 쇼에서는 명시 적 매개 변수와 함께 모의를 호출 할 수 있습니다.

    mockito에 의해 캡처 인수를 적용 할 것이다 확인 자신에 가까운 당신은 뭔가를 작성할 수 있습니다.

    Mockito는 내부적으로 호출 및 예컨대과의 인수를 기록합니다 : http://code.google.com/p/mockito/source/browse/trunk/src/org/mockito/internal/matchers/CapturingMatcher.java

  3. ==============================

    3.당신은 specs2을 시도 할 수 있습니다. specs2, 우리는 요소 별명 매개 변수에 대한 계정에 Mockito 호출 클래스를 "공중 납치"

    당신은 specs2을 시도 할 수 있습니다. specs2, 우리는 요소 별명 매개 변수에 대한 계정에 Mockito 호출 클래스를 "공중 납치"

    trait ByName { def call(i: =>Int) = i }
    val byname = mock[ByName]
    
    byname.call(10)
    there was one(byname).call(10)
    
  4. from https://stackoverflow.com/questions/2152019/how-to-mock-a-method-with-functional-arguments-in-scala by cc-by-sa and MIT license