2

モデルを持つプロジェクトで ActiveJDBC を使用していますScriptRule。添付のコード スニペットを見つけてください。

    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();utils リストしか作成できないため、a は機能しません。ActiveJDBC でこのような単体テストを行った経験のある人はいますか。

助けてください。

4

2 に答える 2

2

あなたの問題は、そこにテストしにくいコードを書いたことです。これを解決する 1 つの方法は、Powermockを使用することです。しかし、そうしても、製品コード内の設計上の問題は解決しません。

代わりに、次のようなものを検討してください。

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

とのような愚かな実装

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

これで、依存性注入を使用して、 RuleFinderインターフェースを実装するオブジェクトをプロダクション コードに提供できるようになりました。そして重要なことは、実行時に、そのオブジェクトは単にその impl クラスのインスタンスであり、 ScriptRuleの静的メソッドを呼び出すことです。

ただし、テストのために、モックオブジェクトを注入できます。

そして、new への最後の呼び出しのために; 再び依存性注入を使用してfactoryを使用します。

これが、テスト可能で十分に分離された製品コードを作成する方法です。テストが困難な製品コードを作成し、重い Powermock ハンマーを使用して欠陥のある設計を「修正」するのとは対照的です。

「テスト可能なコードを書く」の詳細については、これらのビデオをご覧ください。

于 2016-09-26T12:24:30.710 に答える