2017-03-02 7 views
2

実際の関数呼び出しの中で疑似関数を使用することはできますか?どちらの関数も同じオブジェクトにあります。したがって、たとえば、私は実際の関数呼び出しで模擬関数の戻り値を使用する

obj A { 
    def mockThis(value: Int): Int = { 
    value*5 
    } 

    def realFuncIWantToTest(value: Int): Int = { 
    val v = mockThis(value) 
    v 
    } 
} 

を持っている場合、明らかにこれは非常に単純なケースであり、これは(vは実際には複雑なオブジェクトである)私のコードが何をしているのかではありません。基本的には、realFuncIWantToTestが私が定義した擬似関数の戻り値を使用するようにします。

ありがとうございます!

答えて

2

あなたはかもしれません Mockitoのスパイを使ってこれを行うことができます。その例についてはhereを参照してください。

スパイは、基本的には、テスト対象のクラスの本当オブジェクトの周りにそのスパイラッピングを持つことによって動作します。

ここでも1つの言葉:できる場合でもデザインを変更することを検討してください。この「部分的な嘲笑」は、あなたのクラスが独責の原則に違反していることを示していることがよくあります。意味:クラスは「1つ」のことを担当する必要があります。しかし、部分的にモック物事をあなたのクラス内に持つことができるという考えは、あなたのクラスが少なくとも2つの、どういうわけか切断面を担当していることを示しています。その意味で

より良いアプローチはmockThis()オブジェクトの呼び出しになることでしょう。このクラスに依存性注入を介して挿入することができます。

短い記事:少なくともJavaレベルでは、あなたのアイデアはうまくいくはずです(Mockitoはscalaオブジェクトでうまく動作するという疑いがあります)。概念的なポイントポイントから。このようにするのはやめてください。

+0

最後に、私はデザインを変更し、自分のコードをリファクタリングすることにしました。 'mockThis()'を依存性インジェクションで挿入した別のオブジェクトの呼び出しとする提案は、まさに私がやったことです。しばらく時間をとったが、最終的にはそれがもっときれいになり、読めるようになった。助けてくれてありがとう! – learningboy

+0

あなたはとても歓迎されています。 – GhostCat

関連する問題