2012-08-02 94 views
1

傳遞給嘲笑方法的參數集下面是一個簡單的規範再現問題:無法驗證specs2

package ro.igstan.learning 

import org.specs2.matcher.ThrownExpectations 
import org.specs2.mock.Mockito 
import org.specs2.mutable.Specification 
import org.specs2.specification.Scope 

class LearningSpecs2 extends Specification { 

    trait Logger { 
    def error(a: String, b: String) 
    } 

    trait mocks extends Mockito with Scope with ThrownExpectations { 
    val mockedLogger = mock[Logger] 
    } 

    "mocking" should { 
    // passes 
    "be able to verify arguments passed to mocks" in new mocks { 
     mockedLogger.error("message", "foo") 

     got { 
     one(mockedLogger).error("message", "foo") 
     } 
    } 

    // fails 
    "be able to *partially* verify arguments passed to mocks" in new mocks { 
     mockedLogger.error("message", "foo") 

     got { 
     one(mockedLogger).error(any, ===("foo")) 
     } 
    } 
    } 
} 

這是輸出:

[info] mocking should 
[info] + be able to verify arguments passed to mocks 
[error] ! Fragment evaluation error 
[error]  ThrowableException: org/hamcrest/TypeSafeMatcher (FutureTask.java:303) 
[error] ro.igstan.learning.LearningSpecs2$$anonfun$3$$anonfun$apply$3$$anon$2.argThat(LearningSpecs2.scala:27) 
[error] ro.igstan.learning.LearningSpecs2$$anonfun$3$$anonfun$apply$3$$anon$2$$anonfun$2.apply$mcV$sp(LearningSpecs2.scala:31) 
[error] ro.igstan.learning.LearningSpecs2$$anonfun$3$$anonfun$apply$3$$anon$2$$anonfun$2.apply(LearningSpecs2.scala:31) 
[error] ro.igstan.learning.LearningSpecs2$$anonfun$3$$anonfun$apply$3$$anon$2$$anonfun$2.apply(LearningSpecs2.scala:31) 
[error] ro.igstan.learning.LearningSpecs2$$anonfun$3$$anonfun$apply$3$$anon$2.got(LearningSpecs2.scala:27) 
[error] ro.igstan.learning.LearningSpecs2$$anonfun$3$$anonfun$apply$3$$anon$2.<init>(LearningSpecs2.scala:30) 
[error] ro.igstan.learning.LearningSpecs2$$anonfun$3$$anonfun$apply$3.apply(LearningSpecs2.scala:27) 
[error] ro.igstan.learning.LearningSpecs2$$anonfun$3$$anonfun$apply$3.apply(LearningSpecs2.scala:27) 
[error] ro.igstan.learning.LearningSpecs2$$anonfun$3$$anonfun$apply$3$$anon$2.argThat(LearningSpecs2.scala:27) 
[error] ro.igstan.learning.LearningSpecs2$$anonfun$3$$anonfun$apply$3$$anon$2$$anonfun$2.apply$mcV$sp(LearningSpecs2.scala:31) 
[error] ro.igstan.learning.LearningSpecs2$$anonfun$3$$anonfun$apply$3$$anon$2$$anonfun$2.apply(LearningSpecs2.scala:31) 
[error] ro.igstan.learning.LearningSpecs2$$anonfun$3$$anonfun$apply$3$$anon$2$$anonfun$2.apply(LearningSpecs2.scala:31) 
[error] ro.igstan.learning.LearningSpecs2$$anonfun$3$$anonfun$apply$3$$anon$2.got(LearningSpecs2.scala:27) 
[error] ro.igstan.learning.LearningSpecs2$$anonfun$3$$anonfun$apply$3$$anon$2.<init>(LearningSpecs2.scala:30) 
[error] ro.igstan.learning.LearningSpecs2$$anonfun$3$$anonfun$apply$3.apply(LearningSpecs2.scala:27) 
[error] ro.igstan.learning.LearningSpecs2$$anonfun$3$$anonfun$apply$3.apply(LearningSpecs2.scala:27) 
[error] org/hamcrest/TypeSafeMatcher 
[error] ro.igstan.learning.LearningSpecs2$$anonfun$3$$anonfun$apply$3$$anon$2.argThat(LearningSpecs2.scala:27) 
[error] ro.igstan.learning.LearningSpecs2$$anonfun$3$$anonfun$apply$3$$anon$2$$anonfun$2.apply$mcV$sp(LearningSpecs2.scala:31) 
[error] ro.igstan.learning.LearningSpecs2$$anonfun$3$$anonfun$apply$3$$anon$2$$anonfun$2.apply(LearningSpecs2.scala:31) 
[error] ro.igstan.learning.LearningSpecs2$$anonfun$3$$anonfun$apply$3$$anon$2$$anonfun$2.apply(LearningSpecs2.scala:31) 
[error] ro.igstan.learning.LearningSpecs2$$anonfun$3$$anonfun$apply$3$$anon$2.got(LearningSpecs2.scala:27) 
[error] ro.igstan.learning.LearningSpecs2$$anonfun$3$$anonfun$apply$3$$anon$2.<init>(LearningSpecs2.scala:30) 
[error] ro.igstan.learning.LearningSpecs2$$anonfun$3$$anonfun$apply$3.apply(LearningSpecs2.scala:27) 
[error] ro.igstan.learning.LearningSpecs2$$anonfun$3$$anonfun$apply$3.apply(LearningSpecs2.scala:27) 
[error] org.hamcrest.TypeSafeMatcher 
[error] ro.igstan.learning.LearningSpecs2$$anonfun$3$$anonfun$apply$3$$anon$2.argThat(LearningSpecs2.scala:27) 
[error] ro.igstan.learning.LearningSpecs2$$anonfun$3$$anonfun$apply$3$$anon$2$$anonfun$2.apply$mcV$sp(LearningSpecs2.scala:31) 
[error] ro.igstan.learning.LearningSpecs2$$anonfun$3$$anonfun$apply$3$$anon$2$$anonfun$2.apply(LearningSpecs2.scala:31) 
[error] ro.igstan.learning.LearningSpecs2$$anonfun$3$$anonfun$apply$3$$anon$2$$anonfun$2.apply(LearningSpecs2.scala:31) 
[error] ro.igstan.learning.LearningSpecs2$$anonfun$3$$anonfun$apply$3$$anon$2.got(LearningSpecs2.scala:27) 
[error] ro.igstan.learning.LearningSpecs2$$anonfun$3$$anonfun$apply$3$$anon$2.<init>(LearningSpecs2.scala:30) 
[error] ro.igstan.learning.LearningSpecs2$$anonfun$3$$anonfun$apply$3.apply(LearningSpecs2.scala:27) 
[error] ro.igstan.learning.LearningSpecs2$$anonfun$3$$anonfun$apply$3.apply(LearningSpecs2.scala:27) 

這裏是庫版本爲報道由SBT依賴圖插件:

[info] default:learning_2.9.1:1.0.0 
[info] +-junit:junit:4.7 
[info] +-org.mockito:mockito-all:1.9.0 
[info] +-org.scala-lang:scala-library:2.9.1 
[info] +-org.specs2:specs2_2.9.1:1.11 
[info]  +-org.specs2:specs2-scalaz-core_2.9.1:6.0.1 
[info]  +-org.scala-lang:scala-library:2.9.1 

任何想法是怎麼回事?

回答

1

固定。我不得不明確指定Hamcrest版本:

libraryDependencies ++= Seq(
    "org.specs2" %% "specs2"  % "1.11" , 
    "org.mockito" % "mockito-all" % "1.9.0", 
    "org.hamcrest" % "hamcrest-all" % "1.3", // <- this was missing 
    "junit"  % "junit"  % "4.7" 
)