-2

現在、コードは次のように始まります

Directory directory = DirectoryServiceFactory.getDirectoryService();

directory.groups().get(someEmail).execute();

テストケースの書き方がわからない、またはテストケースを書くべきかさえわかりません。ここにテストケースを書くとはどういう意味ですか。

4

1 に答える 1

1

理論的には、独自のコードのみをテストする必要があります。フレームワークをテストする必要がある場合は、間違ったフレームワークを使用しています。リモートのような Google API への接続と使用は、統合テストでのみテストするものであり、単体テストではテストしません。

したがって、この場合、Google API に接続するクラスのモック バージョンを配置し、そこで何かを実行できるように、独自のコードをカプセル化しようとします。たとえば、次のGoogleAPIConnector Interfaceように記述します。

public interface GoogleAPIConnector {

    void connect();
    String doSomeWork(String email);

}

このインターフェースの「実際の」実装を 1 つ作成して、実際に Google に接続し、実際の作業を行います。これをテストすることは、統合テストの範囲になります。なんとなくこんな感じになりそう…。

public class GoogleAPIConnectorImpl {

    private Directory directory;

    @Override
    public void connect() {
        this.directory = DirectoryServiceFactory.getDirectoryService();
    }

    @Override
    public String doSomeWork(String email){
        return this.directory.groups().get(email).execute();
    }

}

単体テストでは、実際のデータではなく「偽の」データを返すモック オブジェクトを使用します。これにより、Google 接続が機能することを前提としてテストを実行し、その周りに記述したすべてのものをテストできます。たとえば、(Mockito を使用) ):

GoogleAPIConnector connector = mock(GoogleAPIConnector.class);
when(connector.doSomeWork("someone@example.com")).thenReturn("hello world");

SomeClass someClass = new SomeClass(""someone@example.com");
someClass.setConnector(connector);

String result = someClass.work();
assertThat(result, equalTo("hello world");

verify(connector, times(1)).doSomeWork("someone@example.com");

このようにすると、ユニット テストが高速になり、Google API に依存しなくなります (ネットワークがダウンしても、ユニット テストは成功します)。統合テストは遅くなり、Google API に依存しますが、頻繁に実行する必要がない (ビルドに失敗する必要がない) ため、問題ありません。

于 2015-08-14T09:21:49.953 に答える