2

私はGWT/Javaが初めてで、この単純な問題を解決する方法についていくつかのアイデアが必要です(そうあるべきだと思われます)。

GWT オブジェクトがあり、プライベート メソッドをテストしようとしています。

public class BarChart extends FlowPanel {

    public BarChart() {
        super();
        privateMethod();
    }

    privateMethod() { 
        //want to test this 
    }
}

JUnit を試しましたが、このオブジェクトには GWT.create() が必要なため GWTTestCase である必要があり、リフレクションを試しましたが、GWTTestCase はサポートしていません。

4

2 に答える 2

7

あなたが探している答えにならないことはわかっていますが、プライベートメソッドの単体テストは悪い形です。

プライベート メソッドの効果をパブリック API 経由でテスト/観察できるように、コードをリファクタリングする必要があります。

あなたが提供したコード サンプルは非常に短いため、特定の戦略を提供することは困難ですが、ユース ケースについていくつかの一般的なステートメントを作成できます。

プライベート メソッドをテストする最良の方法は、別のパブリック メソッドを使用することです。これができない場合は、次のいずれかの条件が当てはまります。

  1. プライベート メソッドは到達不能 (デッド) コードです
  2. テストしているクラスの近くにデザインの匂いがあります。プライベート メソッドは、まだクラスに目に見える影響を与えているはずです
  3. テストしようとしているメソッドはプライベートであってはなりません。おそらく、メソッドの可視性を変更することは、この例では完全に受け入れられます。

さらに、 GWT UIBinderを使用して、UI コードをアプリケーション ロジックから分離できます。UI を分離したら、JUnit テストを使用して残りのコードをテストできます。GWTTestcases は、GWT.create(...) を必要とするクラス専用であり、(junit と比較して) 非常にゆっくりと実行されるため、テストの大部分が junit を使用して実行できるようにコードを構成し、次に gwttestcase を使用することをお勧めします。残りをカバーします。この構造を実現できれば、easymock/mockito/reflection などを使用してテストするための追加の道が開かれます。

于 2013-04-11T19:28:23.847 に答える
3

GWT クライアント (GWTTestCase に含まれる) では、JSNI を使用してプライベート メソッドまたは保護されたメソッドを呼び出すことができます。これは、violator pattern

プライベート メソッドを持つクラスが与えられた場合

package com.example;
public class MyClass {
  private MyObjectReturn myMethod(MyObjectParam param) {
     return null
  }
}

jsni メソッドを作成してアクセスする

native MyObjectReturn myViolatorMethod(MyClass instance, MyObjectParam param) /*-{
  return instance.@com.example.MyClass::myMethod(*)(param);
}-*/;
于 2013-04-11T19:46:35.607 に答える