1

パブリックメソッドをユニットテストしたいEJBがあります。私はEJBをpojoとしてテストしています。だから私はそれをインスタンス化してパブリックメソッドを呼び出しました。

問題は、パブリックメソッドがいくつかのGlassfish環境プロパティを設定し、環境変数がプライベートになることです。そのため、クラスの外に設定することはできず、環境オブジェクトに対してそのパブリックメソッドを呼び出すだけで、nullPointerExceptionがスローされます。

私がテストしたいクラスには、

@Resource(name="NameServiceEnvironment")
private Properties nameServiceEnvironment;



    public void setup() {

        // Set the environment.
        Properties environment = new Properties(); 
        environment.setProperty("name.host", this.nameServiceEnvironment.getProperty(NAME_HOST));
        environment.setProperty("name.port", this.nameServiceEnvironment.getProperty(NAME_PORT));

...}

したがって、nameServiceEnvironmentの場合、nullポインタ例外がスローされます。

テストクラスから、上記のクラスをインスタンス化して、setupメソッドを呼び出しました。

ありがとう。

4

4 に答える 4

2

プライベートメソッドでも、いつでもアクセスできます。テストでリフレクションを使用して、プライベートプロパティにアクセスします。それらを設定し、続行します。

于 2012-07-14T01:18:56.080 に答える
2

ユニットテスト時にセッターを追加し、nameServiceEnvironment独自のセッターを注入します。nameServiceEnvironment

コメントに基づいて更新

または、セットアップから別のメソッドにプロパティビットを抽出し、テストでオーバーライドして偽造することもできます。

public void setup() { 
    setupEnvironment();            
    ...
}

void setupEnvironment(){ //you would override this in your unit test
   Properties environment = new Properties(); 
   environment.setProperty("name.host", this.nameServiceEnvironment.getProperty(NAME_HOST));
   environment.setProperty("name.port", this.nameServiceEnvironment.getProperty(NAME_PORT));
}

まあ、正確には偽物ではありません。テストでは、このビットをバイパスするだけです。

于 2012-07-14T01:23:52.237 に答える
1

nameServiceEnvironmentは、を使用して設定されます

@Resource(name="NameServiceEnvironment")

したがって、テスト環境でそのリソースが構成されていることを確認する必要があります(Glassfish環境の場合と同様)。たとえば、Springを使用できます。

于 2012-07-14T01:23:32.373 に答える
1

nameServiceEnvironmentが注入されていないためですか?これが、アルキリア星人が人気を博した理由の1つです。コンテナ内のejbをユニットテストするために数か月使用しましたが、(少なくとも私にとっては)使いやすさはありませんでした。arquillianを使用すると、すべての依存性注入を実行してから、テストメソッドを実行できます。別の提案として、リフレクションも使用しました。また、使用するDIフレームワークによっては、それを注入するテスト用に構成することもできます。

それをしたい場合のリフレクションコード:

public class ATest {

@Test
public void testEjb() throws Exception {
    MyEJB myEjb = new MyEJB();
    Class<? extends MyEJB> cls = myEjb.getClass();
    Field field = cls.getDeclaredField("props");
    field.setAccessible(true);
    field.set(myEjb, new Properties());
    myEjb.somePublicMethod();
}   
class MyEJB {
    private Properties props;
    public void somePublicMethod() {
        System.out.println("props has: " + props);
    }
}

}

于 2012-07-14T01:26:03.003 に答える