diff --git a/core/net/src/test/java/org/onosproject/net/flowobjective/impl/InOrderFlowObjectiveManagerTest.java b/core/net/src/test/java/org/onosproject/net/flowobjective/impl/InOrderFlowObjectiveManagerTest.java
index 9797442..f7ba5bc 100644
--- a/core/net/src/test/java/org/onosproject/net/flowobjective/impl/InOrderFlowObjectiveManagerTest.java
+++ b/core/net/src/test/java/org/onosproject/net/flowobjective/impl/InOrderFlowObjectiveManagerTest.java
@@ -66,7 +66,9 @@
 
 import java.util.Collection;
 import java.util.List;
+import java.util.Objects;
 import java.util.Random;
+import java.util.concurrent.atomic.AtomicInteger;
 
 public class InOrderFlowObjectiveManagerTest {
     private InOrderFlowObjectiveManager mgr;
@@ -96,6 +98,7 @@
     // Delay flow objectives OFFSET + rand(0, BOUND) millis
     private static final int DEFAULT_OFFSET = 10; // ms
     private static final int DEFAULT_BOUND = 40; // ms
+    private static final int TIMEOUT_THRESH = 100; // ms
     private static int offset = DEFAULT_OFFSET;
     private static int bound = DEFAULT_BOUND;
 
@@ -131,16 +134,6 @@
     private List<ForwardingObjective> expectFwdObjs = Lists.newCopyOnWriteArrayList(
             Lists.newArrayList(FWD1, FWD2, FWD3, FWD4, FWD5, FWD6));
 
-    private static boolean timeout = false;
-    private static final ForwardingObjective FWD11 = buildFwdObjective(S1, NID2).add(new ObjectiveContext() {
-        @Override
-        public void onError(Objective objective, ObjectiveError error) {
-            timeout = error.equals(ObjectiveError.INSTALLATIONTIMEOUT);
-        }
-    });
-    private List<ForwardingObjective> expectFwdObjsTimeout = Lists.newCopyOnWriteArrayList(
-            Lists.newArrayList(FWD11, FWD1, FWD2));
-
     private List<Objective> actualObjs = Lists.newCopyOnWriteArrayList();
 
     private Pipeliner pipeliner = new PipelinerAdapter() {
@@ -203,7 +196,6 @@
         mgr.activate();
 
         reset(mgr.flowObjectiveStore);
-        timeout = false;
         offset = DEFAULT_OFFSET;
         bound = DEFAULT_BOUND;
         actualObjs.clear();
@@ -246,12 +238,28 @@
 
     @Test
     public void forwardTimeout() {
+        final AtomicInteger counter = new AtomicInteger(0);
+        ForwardingObjective fwdTimeout = buildFwdObjective(S1, NID2).add(new ObjectiveContext() {
+            @Override
+            public void onError(Objective objective, ObjectiveError error) {
+                if (Objects.equals(ObjectiveError.INSTALLATIONTIMEOUT, error)) {
+                    counter.incrementAndGet();
+                }
+            }
+        });
+        List<ForwardingObjective> expectFwdObjsTimeout = Lists.newCopyOnWriteArrayList(
+                Lists.newArrayList(fwdTimeout, FWD1, FWD2));
+
+        // Reduce timeout so the unit test doesn't have to wait many seconds
+        InOrderFlowObjectiveManager.objTimeoutMs = TIMEOUT_THRESH;
+        setUp();
+
         expect(mgr.flowObjectiveStore.getNextGroup(NID1)).andReturn(NGRP1).times(2);
         expect(mgr.flowObjectiveStore.getNextGroup(NID2)).andReturn(NGRP2).times(2);
         replay(mgr.flowObjectiveStore);
 
         // Force this objective to time out
-        offset = InOrderFlowObjectiveManager.OBJ_TIMEOUT_MS + 500;
+        offset = InOrderFlowObjectiveManager.objTimeoutMs * 2;
 
         expectFwdObjsTimeout.forEach(fwdObj -> mgr.forward(DEV1, fwdObj));
 
@@ -259,8 +267,8 @@
         int expectedTime = (bound + offset) * 3;
         assertAfter(expectedTime, expectedTime * 5, () -> assertEquals(expectFwdObjsTimeout.size(), actualObjs.size()));
 
-        assertTrue(timeout);
-        assertTrue(actualObjs.indexOf(FWD11) < actualObjs.indexOf(FWD1));
+        assertTrue(counter.get() != 0);
+        assertTrue(actualObjs.indexOf(fwdTimeout) < actualObjs.indexOf(FWD1));
 
         verify(mgr.flowObjectiveStore);
     }
