diff --git a/apps/mappingmanagement/api/src/test/java/org/onosproject/mapping/actions/MappingActionsTest.java b/apps/mappingmanagement/api/src/test/java/org/onosproject/mapping/actions/MappingActionsTest.java
new file mode 100644
index 0000000..68a989f
--- /dev/null
+++ b/apps/mappingmanagement/api/src/test/java/org/onosproject/mapping/actions/MappingActionsTest.java
@@ -0,0 +1,113 @@
+/*
+ * Copyright 2017-present Open Networking Laboratory
+ *
+ * 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 org.onosproject.mapping.actions;
+
+import org.junit.Test;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.equalTo;
+import static org.hamcrest.Matchers.instanceOf;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.notNullValue;
+import static org.onlab.junit.ImmutableClassChecker.assertThatClassIsImmutable;
+import static org.onlab.junit.UtilityClassChecker.assertThatClassIsUtility;
+
+/**
+ * Unit tests for various mapping action implementation classes.
+ */
+public class MappingActionsTest {
+
+    /**
+     * Checks that a MappingAction object has the proper type, and then converts
+     * it to the proper type.
+     *
+     * @param action MappingAction object to convert
+     * @param type   Enumerated type value for the MappingAction class
+     * @param clazz  Desired MappingAction class
+     * @param <T>    The type the caller wants returned
+     * @return converted object
+     */
+    @SuppressWarnings("unchecked")
+    private <T> T checkAndConvert(MappingAction action, MappingAction.Type type, Class clazz) {
+        assertThat(action, is(notNullValue()));
+        assertThat(action.type(), is(equalTo(type)));
+        assertThat(action, instanceOf(clazz));
+        return (T) action;
+    }
+
+    /**
+     * Checks that the MappingActions class is a valid utility class.
+     */
+    @Test
+    public void testMappingActionsUtility() {
+        assertThatClassIsUtility(MappingActions.class);
+    }
+
+    /**
+     * Checks that the mapping action implementations are immutable.
+     */
+    @Test
+    public void testMappingActionsImmutability() {
+        assertThatClassIsImmutable(NoMappingAction.class);
+        assertThatClassIsImmutable(ForwardMappingAction.class);
+        assertThatClassIsImmutable(NativeForwardMappingAction.class);
+        assertThatClassIsImmutable(DropMappingAction.class);
+    }
+
+    /**
+     * Tests the noAction method.
+     */
+    @Test
+    public void testNoActionMethod() {
+        MappingAction mappingAction = MappingActions.noAction();
+        checkAndConvert(mappingAction,
+                        MappingAction.Type.NO_ACTION,
+                        NoMappingAction.class);
+    }
+
+    /**
+     * Tests the forward method.
+     */
+    @Test
+    public void testForwardMethod() {
+        MappingAction mappingAction = MappingActions.forward();
+        checkAndConvert(mappingAction,
+                        MappingAction.Type.FORWARD,
+                        ForwardMappingAction.class);
+    }
+
+    /**
+     * Tests the native forward method.
+     */
+    @Test
+    public void testNativeForwardMethod() {
+        MappingAction mappingAction = MappingActions.nativeForward();
+        checkAndConvert(mappingAction,
+                        MappingAction.Type.NATIVE_FORWARD,
+                        NativeForwardMappingAction.class);
+    }
+
+    /**
+     * Tests the drop method.
+     */
+    @Test
+    public void testDropMethod() {
+        MappingAction mappingAction = MappingActions.drop();
+        checkAndConvert(mappingAction,
+                        MappingAction.Type.DROP,
+                        DropMappingAction.class);
+    }
+}
