diff --git a/src/main/java/com/googlesource/gerrit/plugins/cfoauth/JsonUtils.java b/src/main/java/com/googlesource/gerrit/plugins/cfoauth/JsonUtils.java
new file mode 100644
index 0000000..0227eed
--- /dev/null
+++ b/src/main/java/com/googlesource/gerrit/plugins/cfoauth/JsonUtils.java
@@ -0,0 +1,51 @@
+// Copyright (C) 2015 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.googlesource.gerrit.plugins.cfoauth;
+
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+import com.google.gson.JsonPrimitive;
+
+public class JsonUtils {
+
+  public static String getAttribute(JsonObject json, String name) {
+    JsonPrimitive prim = getAsJsonPrimitive(json, name);
+    return prim != null && prim.isString() ? prim.getAsString() : null;
+  }
+
+  public static long getLongAttribute(JsonObject json, String name,
+      long defaultValue) {
+    JsonPrimitive prim = getAsJsonPrimitive(json, name);
+    return prim != null && prim.isNumber() ? prim.getAsLong() : defaultValue;
+  }
+
+  public static JsonPrimitive getAsJsonPrimitive(JsonObject json, String name) {
+    JsonElement attr = json.get(name);
+    if (attr == null || !attr.isJsonPrimitive()) {
+      return null;
+    }
+    return attr.getAsJsonPrimitive();
+  }
+
+  public static JsonObject getAsJsonObject(String s) {
+    JsonElement json = new JsonParser().parse(s);
+    if (!json.isJsonObject()) {
+      return new JsonObject();
+    }
+    return json.getAsJsonObject();
+  }
+
+}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/cfoauth/UAAClient.java b/src/main/java/com/googlesource/gerrit/plugins/cfoauth/UAAClient.java
index e2ccc02..259339d 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/cfoauth/UAAClient.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/cfoauth/UAAClient.java
@@ -14,6 +14,8 @@
 
 package com.googlesource.gerrit.plugins.cfoauth;
 
+import static com.googlesource.gerrit.plugins.cfoauth.JsonUtils.*;
+
 import static java.net.HttpURLConnection.HTTP_OK;
 import static java.nio.charset.StandardCharsets.US_ASCII;
 import static java.nio.charset.StandardCharsets.UTF_8;
@@ -25,10 +27,7 @@
 
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Strings;
-import com.google.gson.JsonElement;
 import com.google.gson.JsonObject;
-import com.google.gson.JsonParser;
-import com.google.gson.JsonPrimitive;
 
 import org.apache.commons.codec.binary.Base64;
 import org.scribe.model.OAuthRequest;
@@ -273,12 +272,6 @@
         "Unsupported signature algorithm ''{0}''", alg));
   }
 
-  @VisibleForTesting
-  String getAttribute(JsonObject json, String name) {
-    JsonPrimitive prim = getAsJsonPrimitive(json, name);
-    return prim != null && prim.isString() ? prim.getAsString() : null;
-  }
-
   private String getAccessTokenAttribute(String tokenResponse)
       throws UAAClientException {
     JsonObject json = getAsJsonObject(tokenResponse);
@@ -290,28 +283,6 @@
     return accessToken;
   }
 
-  @VisibleForTesting
-  long getLongAttribute(JsonObject json, String name, long defaultValue) {
-    JsonPrimitive prim = getAsJsonPrimitive(json, name);
-    return prim != null && prim.isNumber() ? prim.getAsLong() : defaultValue;
-  }
-
-  private JsonPrimitive getAsJsonPrimitive(JsonObject json, String name) {
-    JsonElement attr = json.get(name);
-    if (attr == null || !attr.isJsonPrimitive()) {
-      return null;
-    }
-    return attr.getAsJsonPrimitive();
-  }
-
-  private JsonObject getAsJsonObject(String s) {
-    JsonElement json = new JsonParser().parse(s);
-    if (!json.isJsonObject()) {
-      return new JsonObject();
-    }
-    return json.getAsJsonObject();
-  }
-
   private String decodeBase64(String s) {
     return new String(Base64.decodeBase64(s), UTF_8);
   }
diff --git a/src/test/java/com/googlesource/gerrit/plugins/cfoauth/UAAClientTest.java b/src/test/java/com/googlesource/gerrit/plugins/cfoauth/UAAClientTest.java
index 2616784..244286c 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/cfoauth/UAAClientTest.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/cfoauth/UAAClientTest.java
@@ -15,15 +15,11 @@
 package com.googlesource.gerrit.plugins.cfoauth;
 
 import static org.junit.Assert.*;
+import static com.googlesource.gerrit.plugins.cfoauth.JsonUtils.getAttribute;
+import static com.googlesource.gerrit.plugins.cfoauth.JsonUtils.getLongAttribute;
 
 import com.google.gson.JsonObject;
 
-import com.googlesource.gerrit.plugins.cfoauth.AccessToken;
-import com.googlesource.gerrit.plugins.cfoauth.HMACSHA256SignatureVerifier;
-import com.googlesource.gerrit.plugins.cfoauth.SignatureVerifier;
-import com.googlesource.gerrit.plugins.cfoauth.UAAClient;
-import com.googlesource.gerrit.plugins.cfoauth.UAAClientException;
-
 import org.junit.Before;
 import org.junit.Test;
 
@@ -110,9 +106,9 @@
   @Test
   public void testToJsonWebToken() throws Exception {
     JsonObject jsonWebToken = client.toJsonWebToken(HS256_TEST_TOKEN);
-    assertEquals("marissa", client.getAttribute(jsonWebToken, "user_name"));
-    assertEquals("marissa@test.org", client.getAttribute(jsonWebToken, "email"));
-    assertEquals(1436232932L, client.getLongAttribute(jsonWebToken, "exp", 0));
+    assertEquals("marissa", getAttribute(jsonWebToken, "user_name"));
+    assertEquals("marissa@test.org", getAttribute(jsonWebToken, "email"));
+    assertEquals(1436232932L, getLongAttribute(jsonWebToken, "exp", 0));
   }
 
   @Test(expected = UAAClientException.class)
