Add support to decode Device, Port, Link JSON.

- Device, Port, Link can now be encoded and decoded back to Java Object,
  which will be Object#equals to the original.
- Modified DeviceServiceAdapter to be null-safe when possible
- Modified JSON assertion/matcher not to check for exact number of attributes

Change-Id: I7cf02e2254cf17f6265fb15847912519e564b14f
diff --git a/core/common/src/test/java/org/onosproject/codec/impl/MockCodecContext.java b/core/common/src/test/java/org/onosproject/codec/impl/MockCodecContext.java
index 25a4fbb..4c869c1 100644
--- a/core/common/src/test/java/org/onosproject/codec/impl/MockCodecContext.java
+++ b/core/common/src/test/java/org/onosproject/codec/impl/MockCodecContext.java
@@ -15,6 +15,9 @@
  */
 package org.onosproject.codec.impl;
 
+import java.util.HashMap;
+import java.util.Map;
+
 import org.onosproject.codec.CodecContext;
 import org.onosproject.codec.JsonCodec;
 
@@ -25,8 +28,9 @@
  */
 public class MockCodecContext implements CodecContext {
 
-    private ObjectMapper mapper = new ObjectMapper();
-    private CodecManager manager = new CodecManager();
+    private final ObjectMapper mapper = new ObjectMapper();
+    private final CodecManager manager = new CodecManager();
+    private final Map<Class<? extends Object>, Object> services = new HashMap<>();
 
     /**
      * Constructs a new mock codec context.
@@ -46,9 +50,15 @@
         return manager.getCodec(entityClass);
     }
 
+    @SuppressWarnings("unchecked")
     @Override
     public <T> T get(Class<T> serviceClass) {
-        return null;
+        return (T) services.get(serviceClass);
+    }
+
+    // for registering mock services
+    public <T> void registerService(Class<T> serviceClass, T impl) {
+        services.put(serviceClass, impl);
     }
 
 }