diff --git a/web/api/src/test/java/org/onosproject/rest/MetricsResourceTest.java b/web/api/src/test/java/org/onosproject/rest/MetricsResourceTest.java
index 089c5fe..57c68cf 100644
--- a/web/api/src/test/java/org/onosproject/rest/MetricsResourceTest.java
+++ b/web/api/src/test/java/org/onosproject/rest/MetricsResourceTest.java
@@ -18,10 +18,13 @@
 import com.codahale.metrics.Counter;
 import com.codahale.metrics.Meter;
 import com.codahale.metrics.Metric;
+import com.codahale.metrics.Timer;
 import com.eclipsesource.json.JsonArray;
 import com.eclipsesource.json.JsonObject;
 import com.google.common.collect.ImmutableMap;
 import com.sun.jersey.api.client.WebResource;
+import org.hamcrest.Description;
+import org.hamcrest.TypeSafeMatcher;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
@@ -32,6 +35,8 @@
 import org.onosproject.codec.CodecService;
 import org.onosproject.codec.impl.CodecManager;
 
+import java.util.concurrent.TimeUnit;
+
 import static org.easymock.EasyMock.createMock;
 import static org.easymock.EasyMock.expect;
 import static org.easymock.EasyMock.replay;
@@ -40,6 +45,7 @@
 import static org.hamcrest.Matchers.is;
 import static org.hamcrest.Matchers.notNullValue;
 import static org.junit.Assert.assertThat;
+import static org.junit.Assert.assertTrue;
 
 /**
  * Unit tests for Metrics REST APIs.
@@ -73,20 +79,24 @@
     }
 
     /**
-     * Tests that a fetch of a non-existent object throws an exception.
+     * Tests GetAllMetrics method.
      */
     @Test
-    public void testBadGet() {
+    public void testGetAllMetrics() {
         Counter onosCounter = new Counter();
         onosCounter.inc();
 
         Meter onosMeter = new Meter();
         onosMeter.mark();
 
+        Timer onosTimer = new Timer();
+        onosTimer.update(1, TimeUnit.MILLISECONDS);
+
         ImmutableMap<String, Metric> metrics =
                 new ImmutableMap.Builder<String, Metric>()
                         .put("onosCounter", onosCounter)
                         .put("onosMeter", onosMeter)
+                        .put("onosTimer", onosTimer)
                         .build();
 
         expect(mockMetricsService.getMetrics())
@@ -104,6 +114,137 @@
 
         JsonArray jsonMetrics = result.get("metrics").asArray();
         assertThat(jsonMetrics, notNullValue());
-        assertThat(jsonMetrics.size(), is(2));
+        assertThat(jsonMetrics.size(), is(3));
+
+        assertTrue(matchesMetric(metrics.get("onosCounter")).matchesSafely(jsonMetrics.get(0).asObject()));
+        assertTrue(matchesMetric(metrics.get("onosMeter")).matchesSafely(jsonMetrics.get(1).asObject()));
+        assertTrue(matchesMetric(metrics.get("onosTimer")).matchesSafely(jsonMetrics.get(2).asObject()));
+    }
+
+    /**
+     * Hamcrest matcher to check that an device representation in JSON matches
+     * the actual device.
+     */
+    public static class MetricJsonMatcher extends TypeSafeMatcher<JsonObject> {
+        private final Metric metric;
+        private String reason = "";
+
+        public MetricJsonMatcher(Metric metricValue) {
+            this.metric = metricValue;
+        }
+
+        @Override
+        public boolean matchesSafely(JsonObject jsonObject) {
+
+            JsonObject jsonMetric = jsonObject.get("metric").asObject();
+            JsonObject jsonCounter;
+            JsonObject jsonMeter;
+            JsonObject jsonTimer;
+            Counter counter;
+            Meter meter;
+            Timer timer;
+
+            // check counter metric
+            if (jsonMetric.get("counter") != null) {
+                jsonCounter = jsonMetric.get("counter").asObject();
+                counter = (Counter) metric;
+                if (jsonCounter.get("counter").asLong() != counter.getCount()) {
+                    reason = "counter " + counter.getCount();
+                    return false;
+                }
+            }
+
+            // check meter metric
+            if (jsonMetric.get("meter") != null) {
+                jsonMeter = jsonMetric.get("meter").asObject();
+                meter = (Meter) metric;
+
+                if (jsonMeter.get("counter").asLong() != meter.getCount()) {
+                    reason = "counter " + meter.getCount();
+                    return false;
+                }
+
+                if (jsonMeter.get("1_min_rate").asDouble() != meter.getOneMinuteRate()) {
+                    reason = "1 minute rate " + meter.getOneMinuteRate();
+                    return false;
+                }
+
+                if (jsonMeter.get("5_min_rate").asDouble() != meter.getOneMinuteRate()) {
+                    reason = "5 minute rate " + meter.getFiveMinuteRate();
+                    return false;
+                }
+
+                if (jsonMeter.get("15_min_rate").asDouble() != meter.getFifteenMinuteRate()) {
+                    reason = "15 minute rate " + meter.getFifteenMinuteRate();
+                    return false;
+                }
+            }
+
+            if (jsonMetric.get("timer") != null) {
+                jsonTimer = jsonMetric.get("timer").asObject();
+                timer = (Timer) metric;
+
+                if (jsonTimer.get("counter").asLong() != timer.getCount()) {
+                    reason = "counter " + timer.getCount();
+                    return false;
+                }
+
+                if (jsonTimer.get("1_min_rate").asDouble() != timer.getOneMinuteRate()) {
+                    reason = "1 minute rate " + timer.getOneMinuteRate();
+                    return false;
+                }
+
+                if (jsonTimer.get("5_min_rate").asDouble() != timer.getOneMinuteRate()) {
+                    reason = "5 minute rate " + timer.getFiveMinuteRate();
+                    return false;
+                }
+
+                if (jsonTimer.get("15_min_rate").asDouble() != timer.getFifteenMinuteRate()) {
+                    reason = "15 minute rate " + timer.getFifteenMinuteRate();
+                    return false;
+                }
+
+                if (jsonTimer.get("mean").asDouble() != nanoToMs(timer.getSnapshot().getMean())) {
+                    reason = "mean " + timer.getSnapshot().getMean();
+                    return false;
+                }
+
+                if (jsonTimer.get("min").asDouble() != nanoToMs(timer.getSnapshot().getMin())) {
+                    reason = "min " + timer.getSnapshot().getMin();
+                    return false;
+                }
+
+                if (jsonTimer.get("max").asDouble() != nanoToMs(timer.getSnapshot().getMax())) {
+                    reason = "max " + timer.getSnapshot().getMax();
+                    return false;
+                }
+
+                if (jsonTimer.get("stddev").asDouble() != nanoToMs(timer.getSnapshot().getStdDev())) {
+                    reason = "stddev " + timer.getSnapshot().getStdDev();
+                    return false;
+                }
+            }
+
+            return true;
+        }
+
+        @Override
+        public void describeTo(Description description) {
+            description.appendText(reason);
+        }
+
+        private double nanoToMs(double nano) {
+            return nano / 1_000_000D;
+        }
+    }
+
+    /**
+     * Factory to allocate an metric matcher.
+     *
+     * @param metric metric object we are looking for
+     * @return matcher
+     */
+    private static MetricJsonMatcher matchesMetric(Metric metric) {
+        return new MetricJsonMatcher(metric);
     }
 }
