diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/TestExecutor.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/TestExecutor.java
index 113fc67..9f4f248 100644
--- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/TestExecutor.java
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/TestExecutor.java
@@ -1779,19 +1779,7 @@
             InputStream resultStream = executeQueryService(
                     "select dv.DataverseName from Metadata.`Dataverse` as dv order by dv.DataverseName;",
                     getEndpoint(Servlets.QUERY_SERVICE), OutputFormat.CLEAN_JSON);
-            String out = IOUtils.toString(resultStream, StandardCharsets.UTF_8);
-            ObjectMapper om = new ObjectMapper();
-            om.setConfig(om.getDeserializationConfig().with(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT));
-            JsonNode result;
-            try {
-                result = om.readValue(out, ObjectNode.class).get("results");
-            } catch (JsonMappingException e) {
-                LOGGER.warn("error mapping response '{}' to json", out, e);
-                result = null;
-            }
-            if (result == null) {
-                return;
-            }
+            JsonNode result = extractResult(IOUtils.toString(resultStream, StandardCharsets.UTF_8));
             for (int i = 0; i < result.size(); i++) {
                 JsonNode json = result.get(i);
                 if (json != null) {
@@ -1821,6 +1809,21 @@
         }
     }
 
+    private JsonNode extractResult(String jsonString) throws IOException {
+        ObjectMapper om = new ObjectMapper();
+        om.setConfig(om.getDeserializationConfig().with(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT));
+        try {
+            final JsonNode result = om.readValue(jsonString, ObjectNode.class).get("results");
+            if (result == null) {
+                throw new IllegalArgumentException("No field 'results' in " + jsonString);
+            }
+            return result;
+        } catch (JsonMappingException e) {
+            LOGGER.warn("error mapping response '{}' to json", jsonString, e);
+            return om.createArrayNode();
+        }
+    }
+
     //This method is here to enable extension
     protected String getPath(String servlet) {
         return servlet;
