2

以下のメソッドを EasyMock で単体テストする方法。WebResource をモックしようとしましたが、NullPointerException.

public void connect()
{
   Client client = setUpClient();
    WebResource jobBuilder = client.resource("URL");
   String jobXml = jobBuilder.accept(MediaType.APPLICATION_XML)
                .type(MediaType.APPLICATION_JSON)
                .entity(request)
                 .post(String.class);    
}


 public Client setUpClient()
   {
            ClientConfig cc = new DefaultClientConfig();
            cc.getClasses().add(JacksonJsonProvider.class);
            Client client = Client.create(cc);
            return client;
    }
4

1 に答える 1

3

制御の反転原則 ( http://en.wikipedia.org/wiki/Inversion_of_control ) を読む必要があることは明らかです。コードをより適切に設計するためではない場合は、単体テストのために。上記のメソッドのクライアント オブジェクトは、静的ファクトリ メソッド Client.create() を使用して、メソッド自体の内部で作成されます。そのアプローチで模擬コラボレーターを注入する良い方法はありません。セッターまたはコンストラクターを介してクライアントの注入を許可するか、その作成を何らかのファクトリーに委譲する必要があります。

最初のアプローチを使用する場合、単体テストのセットアップ中にセッターまたはコンストラクターを介してモック クライアントを直接注入できます。

2 番目のアプローチを使用する場合は、呼び出されたときにモック クライアントを返すファクトリを提供できます。

編集 5/03:

サードパーティ ライブラリ オブジェクトのオブジェクト ファクトリを提供することで、コードをテスト可能にする例を次に示します。

public class ClassToTest {

    private ClientFactory factory;

    public ClassTotest() {
        this(new ClientFactory());
    }

    public ClassToTest(ClientFactory factory) {
        this.factory = factory;
    }

    public void connect() {
        Client client = factory.getClient();
        WebResource jobBuilder = client.resource("URL");
        String jobXml = jobBuilder.accept(MediaType.APPLICATION_XML)
                    .type(MediaType.APPLICATION_JSON)
                    .entity(request)
                    .post(String.class);    
    }
}

public class ClientFactory() {
    public Client getClient() {
                ClientConfig cc = new DefaultClientConfig();
                cc.getClasses().add(JacksonJsonProvider.class);
                Client client = Client.create(cc);
                return client;
    }
}

これで、アプリケーション コードで、引数なしのコンストラクターを使用してクラスをインスタンス化できます。単体テストでは、他のコンストラクターを使用します。このようにして、WebResource をテストする目的でスクリプトを作成するモック クライアントを挿入できます。

お役に立てれば。

于 2013-05-03T16:00:17.547 に答える