diff --git a/api/controller/api_unittest.py b/api/controller/api_unittest.py
index 63d136c..34c2bca 100644
--- a/api/controller/api_unittest.py
+++ b/api/controller/api_unittest.py
@@ -7,42 +7,63 @@
 
 from __future__ import print_function
 
+from chromite.api import api_config
 from chromite.api import router
 from chromite.api.controller import api as api_controller
 from chromite.api.gen.chromite.api import api_pb2
 from chromite.lib import cros_test_lib
 
 
-class GetMethodsTest(cros_test_lib.MockTestCase):
+class GetMethodsTest(cros_test_lib.MockTestCase, api_config.ApiConfigMixin):
   """GetMethods tests."""
 
+  def setUp(self):
+    self.request = api_pb2.MethodGetRequest()
+    self.response = api_pb2.MethodGetResponse()
+
   def testGetMethods(self):
     """Simple GetMethods sanity check."""
     methods = ['foo', 'bar']
     self.PatchObject(router.Router, 'ListMethods', return_value=methods)
 
-    request = api_pb2.MethodGetRequest()
-    response = api_pb2.MethodGetResponse()
+    api_controller.GetMethods(self.request, self.response, self.api_config)
 
-    api_controller.GetMethods(request, response)
+    self.assertItemsEqual(methods, [m.method for m in self.response.methods])
 
-    self.assertItemsEqual(methods, [m.method for m in response.methods])
+  def testValidateOnly(self):
+    """Sanity check validate only calls only validate."""
+    patch = self.PatchObject(router.Router, 'ListMethods')
+
+    api_controller.GetMethods(self.request, self.response,
+                              self.validate_only_config)
+
+    patch.assert_not_called()
 
 
-class GetVersionTest(cros_test_lib.MockTestCase):
+class GetVersionTest(cros_test_lib.MockTestCase, api_config.ApiConfigMixin):
   """GetVersion tests."""
 
-  def testGetVersion(self):
-    """Simple GetVersion sanity check."""
+  def setUp(self):
     self.PatchObject(api_controller, 'VERSION_MAJOR', new=1)
     self.PatchObject(api_controller, 'VERSION_MINOR', new=2)
     self.PatchObject(api_controller, 'VERSION_BUG', new=3)
 
-    request = api_pb2.VersionGetRequest()
-    response = api_pb2.VersionGetResponse()
+    self.request = api_pb2.VersionGetRequest()
+    self.response = api_pb2.VersionGetResponse()
 
-    api_controller.GetVersion(request, response)
+  def testGetVersion(self):
+    """Simple GetVersion sanity check."""
+    api_controller.GetVersion(self.request, self.response, self.api_config)
 
-    self.assertEqual(response.version.major, 1)
-    self.assertEqual(response.version.minor, 2)
-    self.assertEqual(response.version.bug, 3)
+    self.assertEqual(self.response.version.major, 1)
+    self.assertEqual(self.response.version.minor, 2)
+    self.assertEqual(self.response.version.bug, 3)
+
+  def testValidateOnly(self):
+    """Sanity check validate only calls only validate."""
+    api_controller.GetVersion(self.request, self.response,
+                              self.validate_only_config)
+
+    self.assertFalse(self.response.version.major)
+    self.assertFalse(self.response.version.minor)
+    self.assertFalse(self.response.version.bug)
