ボレー フレームワークの単体テストを作成する方法を知りたいです。要求と応答をモックして、Web サービスの動作とネットワーク アクセスを必要としない単体テストを作成できるようにします。
私はそれをグーグルで検索しましたが、フレームワークに関する多くの情報がまったく見つかりません
ボレー フレームワークの単体テストを作成する方法を知りたいです。要求と応答をモックして、Web サービスの動作とネットワーク アクセスを必要としない単体テストを作成できるようにします。
私はそれをグーグルで検索しましたが、フレームワークに関する多くの情報がまったく見つかりません
res/raw にあるローカル ファイルから偽の応答本文をロードするFakeHttpStackという名前のHttpStackのサブクラスを実装しました。これは開発目的で行いました。つまり、サーバーの準備が整う前に新しい API 用に何かを開発できますが、ここから何かを学ぶことができます (たとえば、HttpStack#peformRequest と createEntity のオーバーライド)。
/**
* Fake {@link HttpStack} that returns the fake content using resource file in res/raw.
*/
class FakeHttpStack implements HttpStack {
private static final String DEFAULT_STRING_RESPONSE = "Hello";
private static final String DEFAULT_JSON_RESPONSE = " {\"a\":1,\"b\":2,\"c\":3}";
private static final String URL_PREFIX = "http://example.com/";
private static final String LOGGER_TAG = "STACK_OVER_FLOW";
private static final int SIMULATED_DELAY_MS = 500;
private final Context context;
FakeHttpStack(Context context) {
this.context = context;
}
@Override
public HttpResponse performRequest(Request<?> request, Map<String, String> stringStringMap)
throws IOException, AuthFailureError {
try {
Thread.sleep(SIMULATED_DELAY_MS);
} catch (InterruptedException e) {
}
HttpResponse response
= new BasicHttpResponse(new BasicStatusLine(HttpVersion.HTTP_1_1, 200, "OK"));
List<Header> headers = defaultHeaders();
response.setHeaders(headers.toArray(new Header[0]));
response.setLocale(Locale.JAPAN);
response.setEntity(createEntity(request));
return response;
}
private List<Header> defaultHeaders() {
DateFormat dateFormat = new SimpleDateFormat("EEE, dd mmm yyyy HH:mm:ss zzz");
return Lists.<Header>newArrayList(
new BasicHeader("Date", dateFormat.format(new Date())),
new BasicHeader("Server",
/* Data below is header info of my server */
"Apache/1.3.42 (Unix) mod_ssl/2.8.31 OpenSSL/0.9.8e")
);
}
/**
* returns the fake content using resource file in res/raw. fake_res_foo.txt is used for
* request to http://example.com/foo
*/
private HttpEntity createEntity(Request request) throws UnsupportedEncodingException {
String resourceName = constructFakeResponseFileName(request);
int resourceId = context.getResources().getIdentifier(
resourceName, "raw", context.getApplicationContext().getPackageName());
if (resourceId == 0) {
Log.w(LOGGER_TAG, "No fake file named " + resourceName
+ " found. default fake response should be used.");
} else {
InputStream stream = context.getResources().openRawResource(resourceId);
try {
String string = CharStreams.toString(new InputStreamReader(stream, Charsets.UTF_8));
return new StringEntity(string);
} catch (IOException e) {
Log.e(LOGGER_TAG, "error reading " + resourceName, e);
}
}
// Return default value since no fake file exists for given URL.
if (request instanceof StringRequest) {
return new StringEntity(DEFAULT_STRING_RESPONSE);
}
return new StringEntity(DEFAULT_JSON_RESPONSE);
}
/**
* Map request URL to fake file name
*/
private String constructFakeResponseFileName(Request request) {
String reqUrl = request.getUrl();
String apiName = reqUrl.substring(URL_PREFIX.length());
return "fake_res_" + apiName;
}
}
FakeHttpStack を使用するには、それをRequestQueueに渡すだけです。RequestQueue もオーバーライドします。
public class FakeRequestQueue extends RequestQueue {
public FakeRequestQueue(Context context) {
super(new NoCache(), new BasicNetwork(new FakeHttpStack(context)));
}
}
このアプローチの良い点は、コードをあまり変更する必要がないことです。テスト時にRequestQueueをFakeRequestQueueに切り替えるだけです。したがって、受け入れテストやシステムテストで使用できます。
一方、単体テストの場合は、もっとコンパクトな方法があるかもしれません。たとえば、Request.Listenerサブクラスを別のクラスとして実装して、onResponse メソッドを簡単にテストできるようにすることができます。何をテストしたいか、またはいくつかのコードフラグメントを追加することについて、より詳細を記載することをお勧めします。