diff --git a/gitiles-servlet/src/test/java/com/google/gitiles/HostIndexServletTest.java b/gitiles-servlet/src/test/java/com/google/gitiles/HostIndexServletTest.java
index 9edfc26..f96a37c 100644
--- a/gitiles-servlet/src/test/java/com/google/gitiles/HostIndexServletTest.java
+++ b/gitiles-servlet/src/test/java/com/google/gitiles/HostIndexServletTest.java
@@ -120,7 +120,7 @@
   @Test
   public void rootJson() throws Exception {
     String name = repo.getRepository().getDescription().getRepositoryName();
-    Map<String, RepositoryDescription> res = buildJson("/", REPOS);
+    Map<String, RepositoryDescription> res = buildJson(REPOS, "/");
 
     assertThat(res).hasSize(1);
     assertThat(res).containsKey(name);
@@ -130,7 +130,7 @@
 
   @Test
   public void fooSubdirJson() throws Exception {
-    Map<String, RepositoryDescription> res = buildJson("/foo/", REPOS);
+    Map<String, RepositoryDescription> res = buildJson(REPOS, "/foo/");
 
     assertThat(res).hasSize(1);
     assertThat(res).containsKey("bar/repo");
@@ -140,7 +140,7 @@
 
   @Test
   public void fooBarSubdirJson() throws Exception {
-    Map<String, RepositoryDescription> res = buildJson("/foo/bar/", REPOS);
+    Map<String, RepositoryDescription> res = buildJson(REPOS, "/foo/bar/");
 
     assertThat(res).hasSize(1);
     assertThat(res).containsKey("repo");
diff --git a/gitiles-servlet/src/test/java/com/google/gitiles/LogServletTest.java b/gitiles-servlet/src/test/java/com/google/gitiles/LogServletTest.java
index a7c9d70..893e259 100644
--- a/gitiles-servlet/src/test/java/com/google/gitiles/LogServletTest.java
+++ b/gitiles-servlet/src/test/java/com/google/gitiles/LogServletTest.java
@@ -37,7 +37,7 @@
   public void basicLog() throws Exception {
     RevCommit commit = repo.branch("HEAD").commit().create();
 
-    Log response = buildJson("/repo/+log", LOG, "");
+    Log response = buildJson(LOG, "/repo/+log");
     assertThat(response.log).hasSize(1);
     verifyJsonCommit(response.log.get(0), commit);
     assertThat(response.log.get(0).treeDiff).isNull();
@@ -50,7 +50,7 @@
     RevCommit c1 = repo.update("master", repo.commit().add("foo", contents1));
     RevCommit c2 = repo.update("master", repo.commit().parent(c1).add("foo", contents2));
 
-    Log response = buildJson("/repo/+log/master", LOG, "&name-status=1");
+    Log response = buildJson(LOG, "/repo/+log/master", "name-status=1");
     assertThat(response.log).hasSize(2);
 
     Commit jc2 = response.log.get(0);
diff --git a/gitiles-servlet/src/test/java/com/google/gitiles/PathServletTest.java b/gitiles-servlet/src/test/java/com/google/gitiles/PathServletTest.java
index 4bc906a..144e311 100644
--- a/gitiles-servlet/src/test/java/com/google/gitiles/PathServletTest.java
+++ b/gitiles-servlet/src/test/java/com/google/gitiles/PathServletTest.java
@@ -213,7 +213,7 @@
         .add("baz", "baz contents")
         .create());
 
-    Tree tree = buildJson("/repo/+/master/", Tree.class);
+    Tree tree = buildJson(Tree.class, "/repo/+/master/");
     assertThat(tree.id).isEqualTo(c.getTree().name());
     assertThat(tree.entries).hasSize(2);
     assertThat(tree.entries.get(0).mode).isEqualTo(0100644);
@@ -225,7 +225,7 @@
     assertThat(tree.entries.get(1).id).isEqualTo(repo.get(c.getTree(), "foo").name());
     assertThat(tree.entries.get(1).name).isEqualTo("foo");
 
-    tree = buildJson("/repo/+/master/foo", Tree.class);
+    tree = buildJson(Tree.class, "/repo/+/master/foo");
     assertThat(tree.id).isEqualTo(repo.get(c.getTree(), "foo").name());
     assertThat(tree.entries).hasSize(1);
     assertThat(tree.entries.get(0).mode).isEqualTo(0100644);
@@ -233,7 +233,7 @@
     assertThat(tree.entries.get(0).id).isEqualTo(repo.get(c.getTree(), "foo/bar").name());
     assertThat(tree.entries.get(0).name).isEqualTo("bar");
 
-    tree = buildJson("/repo/+/master/foo/", Tree.class);
+    tree = buildJson(Tree.class, "/repo/+/master/foo/");
     assertThat(tree.id).isEqualTo(repo.get(c.getTree(), "foo").name());
     assertThat(tree.entries).hasSize(1);
     assertThat(tree.entries.get(0).mode).isEqualTo(0100644);
diff --git a/gitiles-servlet/src/test/java/com/google/gitiles/RefServletTest.java b/gitiles-servlet/src/test/java/com/google/gitiles/RefServletTest.java
index 1cc33e5..c0455fa 100644
--- a/gitiles-servlet/src/test/java/com/google/gitiles/RefServletTest.java
+++ b/gitiles-servlet/src/test/java/com/google/gitiles/RefServletTest.java
@@ -200,7 +200,7 @@
   }
 
   private Map<String, RefJsonData> buildRefJson(String path) throws Exception {
-    return buildJson(path, new TypeToken<Map<String, RefJsonData>>() {});
+    return buildJson(new TypeToken<Map<String, RefJsonData>>() {}, path);
   }
 
   @Test
diff --git a/gitiles-servlet/src/test/java/com/google/gitiles/ServletTest.java b/gitiles-servlet/src/test/java/com/google/gitiles/ServletTest.java
index b0a1dd1..8f6224a 100644
--- a/gitiles-servlet/src/test/java/com/google/gitiles/ServletTest.java
+++ b/gitiles-servlet/src/test/java/com/google/gitiles/ServletTest.java
@@ -19,6 +19,7 @@
 import static javax.servlet.http.HttpServletResponse.SC_NOT_FOUND;
 import static javax.servlet.http.HttpServletResponse.SC_OK;
 
+import com.google.common.base.Strings;
 import com.google.common.net.HttpHeaders;
 import com.google.gson.FieldNamingPolicy;
 import com.google.gson.Gson;
@@ -92,8 +93,10 @@
     return res;
   }
 
-  private String buildJsonRaw(String path, String additionalQueryString) throws Exception {
-    FakeHttpServletResponse res = buildResponse(path, "format=json" + additionalQueryString, SC_OK);
+  private String buildJsonRaw(String path, String queryString) throws Exception {
+    String fmt = "format=JSON";
+    queryString = Strings.isNullOrEmpty(queryString) ? fmt : fmt + "&" + queryString;
+    FakeHttpServletResponse res = buildResponse(path, queryString, SC_OK);
     assertThat(res.getHeader(HttpHeaders.CONTENT_TYPE)).isEqualTo("application/json");
     String body = res.getActualBodyString();
     String magic = ")]}'\n";
@@ -101,22 +104,22 @@
     return body.substring(magic.length());
   }
 
-  protected <T> T buildJson(String path, Class<T> classOfT, String additionalQueryString)
+  protected <T> T buildJson(Class<T> classOfT, String path, String queryString)
       throws Exception {
-    return newGson().fromJson(buildJsonRaw(path, additionalQueryString), classOfT);
+    return newGson().fromJson(buildJsonRaw(path, queryString), classOfT);
   }
 
-  protected <T> T buildJson(String path, Class<T> classOfT) throws Exception {
-    return buildJson(path, classOfT, "");
+  protected <T> T buildJson(Class<T> classOfT, String path) throws Exception {
+    return buildJson(classOfT, path, null);
   }
 
-  protected <T> T buildJson(String path, TypeToken<T> typeOfT, String additionalQueryString)
+  protected <T> T buildJson(TypeToken<T> typeOfT, String path, String queryString)
       throws Exception {
-    return newGson().fromJson(buildJsonRaw(path, additionalQueryString), typeOfT.getType());
+    return newGson().fromJson(buildJsonRaw(path, queryString), typeOfT.getType());
   }
 
-  protected <T> T buildJson(String path, TypeToken<T> typeOfT) throws Exception {
-    return buildJson(path, typeOfT, "");
+  protected <T> T buildJson(TypeToken<T> typeOfT, String path) throws Exception {
+    return buildJson(typeOfT, path, null);
   }
 
   private static Gson newGson() {
diff --git a/gitiles-servlet/src/test/java/com/google/gitiles/blame/BlameServletTest.java b/gitiles-servlet/src/test/java/com/google/gitiles/blame/BlameServletTest.java
index dedbfde..03a962f 100644
--- a/gitiles-servlet/src/test/java/com/google/gitiles/blame/BlameServletTest.java
+++ b/gitiles-servlet/src/test/java/com/google/gitiles/blame/BlameServletTest.java
@@ -71,6 +71,6 @@
   }
 
   private Map<String, List<RegionJsonData>> getBlameJson(String path) throws Exception {
-    return buildJson(path, new TypeToken<Map<String, List<RegionJsonData>>>() {});
+    return buildJson(new TypeToken<Map<String, List<RegionJsonData>>>() {}, path);
   }
 }
