2016-09-26 6 views
1

私のプロジェクトでActiveJDBCを使用していますが、モデルはScriptRuleです。添付のコードスニペットをご覧ください。ユニットテスト用のActiveJDBCのMock findAll()メソッド

public class RuleEvaluatorProvider { 

public static RuleEvaluatorClient getRuleEvaluatorClient() throws ScriptException, IOException { 
    List<ScriptRule> scriptRuleList = ScriptRule.findAll(); 
    // some processing 
    return new RuleEvaluatorClient(someObj); 
} 
} 

私は単体テストの書き込みにPowerMockを使用しています。私はメソッドRuleEvaluatorProvider.getRuleEvaluatorClient()をテストする際に問題に直面しています。 findAll()メソッドは、org.javalite.activejdbc.LazyList<T>オブジェクトを返します。

したがって、私はユーティリティリストのみを作成できるので、PowerMockito.when(ScriptRule.findAll()).thenReturn();は機能しません。誰もActiveJDBCでこれらのようなユニットテストを経験していますか?

助けてください。

答えて

2

あなたの問題は、テストするのが難しいコードをそこに書いたことです。解決の1つの方法は、Powermockを使用しています。しかし、そのようにしても、実動コード内の設計上の問題は解決しません。代わりに

、このような何か考えてみます。

interface RuleFinder { 
    public List<ScriptRule> findAllRules(); 
} 

class RuleFinderImpl implements RuleFinder { 
    @Override 
    public List<ScriptRule> findAllRules() { return ScriptRule.findAll(); } 
} 

のような愚かなIMPL今、あなたはあなたにそのRuleFinderインタフェースを実装するいくつかのオブジェクトを提供するために、依存性注入を使用することができますが生産コード。 そして、そこに重要なことは:実行時に、そのオブジェクトはそののstaticメソッドをScriptRuleに呼び出すそのインプルクラスのインスタンスに過ぎません。

しかし、テストのために模擬オブジェクトを注入することができます。

最後に新しい呼び出しを行います。あなたは工場を使用していますが、依然依存性注入があります。

これは、テスト可能で十分に分離されたプロダクションコードを書く方法です。テストするのが難しい生産コードを書いて重いPowermockハンマーを使って、あなたの欠陥のあるデザインを「修正」します。

"テスト可能なコードを書く"の詳細については、videosをご覧ください。

0

私はこのコードを書く必要はないと思います。言い換えれば、あなたはActiveJDBCモデルから出てくるものを嘲笑しています。ローカルのテストデータベースにアクセスし、テストレコードを書き戻すテストを書く方がはるかに優れています。つまり、ローカルのDBにいくつかのテストレコードを入力してからfindAll()を呼び出し、正しいデータがあることを検証することをお勧めします。

関連する問題