2017-09-21 6 views
1

私はアプリケーションで永続性としてMongodbを使用していますが、現在私のコードのテストを書いています。私のCUTは次のようになりますScalamock:一般的なケースクラスを模擬してタイプミスマッチが発生する

implicit def storageHandler[M[_]: Monad](
    implicit mongoDatabase: MongoDatabase 
) = new Storage.Handler[M] { 
    override def store(order: Order): M[Unit] = Monad[M].pure { 
     val collection: MongoCollection[Document] = mongoDatabase.getCollection("order") 

     val document: Document = Document(order.asJson.toString) 

     collection.insertOne(document).subscribe((x: Completed) =>()) 
    } 
} 

私のモックがインプリシットを使用して正しく注入されています。私は別のモックを生じるはずであるそれ自身の上のどのgetCollectionコールをからかってる、タイプ

MongoCollection[org.mongodb.scala.bson.collection.immutable.Document] 

のこの時間は、だから私はやっている以下の

val mongoCollection: MongoCollection[Document] = mock[MongoCollection[Document]] 

(mongoDatabase.getCollection[Document] _).expects("order").once().returning(mongoCollection) 

しかし、以下では、この結果であり、エラー

type mismatch; 
[error] found : com.mongodb.async.client.MongoCollection[TResult] 
[error] required: com.mongodb.async.client.MongoCollection[org.mongodb.scala.bson.collection.immutable.Document] 
[error] val mongoCollection: MongoCollection[Document] = mock[MongoCollection[Document]] 

TResultは、次のようになりますするMongoCollection、より汎用的なパラメータです:

case class MongoCollection[TResult](private val wrapped: JMongoCollection[TResult]) { 
.... 
} 

あなたのインターフェースが完全に抽象的である場合

+1

こんにちは、あなたがこのバグに出くわしたように見えます:https://github.com/paulbutcher/ScalaMock/issues/170。これはうまくいっていますが、修正するのが難しい –

+0

@PhilippMこの問題を回避する方法はありますか? –

答えて

0

は、型パラメータの前払いを指定すると、仕事、または必要があるドキュメントに(私はそれを呼び出すするかどうかはわかりません)、「調整」の一般的なパラメータが正しくないようですあなたはそのためのプロキシモックを使用することができます。

import org.scalamock.scalatest.MixedMockFactory 
import org.scalatest.{FlatSpec, Matchers} 

import scala.reflect.ClassTag 

class Issue170Test extends FlatSpec with Matchers with MixedMockFactory { 
    behavior of "ScalaMock" 

    it should "mock this" in { 
    class Foo[T: ClassTag] 
    "val m = mock[Foo[Nothing]]" should compile // this one fails :(
    } 

    trait TotallyAbstract[T] { 
    def foo: Int 
    def bar: T 
    } 

    it should "work with this workaround" in { 
    class Foo[T: ClassTag] 
    abstract class Foo2 extends Foo[Int] // workaround: specify type parameter 
    "val m = mock[Foo2]" should compile 
    "val m2 = Proxy.mock[TotallyAbstract[Int]]" should compile 
    } 
} 
関連する問題