2016-04-04 23 views
0

最近Scalaでプログラミングを始めました。私はお互いを呼び出すクラスの階層を持つプロジェクトを持っています。最終的には、MySQLのストアドプロシージャを呼び出すシングルトンのDAL(Data Access Layer)オブジェクトを呼び出します。Scalaのモックを使ってシングルトンオブジェクトをモックする方法

私は次のシグネチャを持つDALのオブジェクトを持っている:

def callStoredProcedure(procName: String, params: Array[String]): Boolean

私はトップレベルのクラスの関数を呼び出すテストを書くのが好き、とprocNameが渡されたかを確認したいです関数。

DALオブジェクトのモックを作成するにはどうすればよいですか?どのように私はそれをプロセスパイプラインに注入することができますか?それを呼び出すのではなく、プロシージャ名を返すモックでシングルトンを置き換える方が良い/推奨される方法はありますか?

私たちは現在Mockitoを使用していますが、私は何かを開いています。

答えて

1

シングルトンを直接使用しないでください。それは良い考えではありません。あなたが理由を知っている?あなたは単体テストのためにそれらを嘲笑することができないので、そうです。

trait DAL { 
    def callStoredProcedure(procName: String, params: Array[String]): Boolean  
} 

object DALImpl extends DAL { 
    def callStoredProcedure(procName: String, params: Array[String]): Boolean = doStuff 
} 

class Foo(dal: DAL = DALImpl) 

val testMe = new Foo(mock[DAL]) 

または

class Foo { 
    def dal: DAL = DALImpl 
} 

val testMe = new Foo { 
    override def dal = mock[DAL] 
} 
0

はあなたが行うことができます:

class Foo(dal: DAL) 

val testMe = new Foo(dal = mock[DAL.type]) 

乾杯

+0

その助け、私はどのようにして求めることができるんならば代わりに、あなたのクラスにパラメータ作る ?私は実際に呼び出されることなく、格納されたprocの名前をつかみたい。スパイはそれをしません。モッキングは、依然としてすべてのレイヤーに注入が必要です。私が間違っているなら私を訂正しますか? –

+0

はい、本当に 'モック[DAL.type]'はディマがあなたに示したように注射を必要としますが、形質を気にする必要はありません。 'spy(DAL)'は、あなたが実際に関数を計算するので実際には関係ありません。私は自分の答えを編集する。 – Joan

関連する問題