現在、コードは次のように始まります
Directory directory = DirectoryServiceFactory.getDirectoryService();
directory.groups().get(someEmail).execute();
テストケースの書き方がわからない、またはテストケースを書くべきかさえわかりません。ここにテストケースを書くとはどういう意味ですか。
現在、コードは次のように始まります
Directory directory = DirectoryServiceFactory.getDirectoryService();
directory.groups().get(someEmail).execute();
テストケースの書き方がわからない、またはテストケースを書くべきかさえわかりません。ここにテストケースを書くとはどういう意味ですか。
理論的には、独自のコードのみをテストする必要があります。フレームワークをテストする必要がある場合は、間違ったフレームワークを使用しています。リモートのような 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 に依存しますが、頻繁に実行する必要がない (ビルドに失敗する必要がない) ため、問題ありません。