diff --git a/src/main/java/org/apache/hadoop/mrunit/MapDriver.java b/src/main/java/org/apache/hadoop/mrunit/MapDriver.java
index f058e03..d769a13 100644
--- a/src/main/java/org/apache/hadoop/mrunit/MapDriver.java
+++ b/src/main/java/org/apache/hadoop/mrunit/MapDriver.java
@@ -217,6 +217,12 @@
     super.withCounter(g, n, expectedValue);
     return this;
   }
+  
+  @Override
+  public MapDriver<K1, V1, K2, V2> withStrictCounterChecking() {
+    super.withStrictCounterChecking();
+    return this;
+  }
 
   public MapDriver<K1, V1, K2, V2> withOutputCopyingOrInputFormatConfiguration(
       Configuration configuration) {
diff --git a/src/main/java/org/apache/hadoop/mrunit/MapReduceDriver.java b/src/main/java/org/apache/hadoop/mrunit/MapReduceDriver.java
index 2de3e8a..6281852 100644
--- a/src/main/java/org/apache/hadoop/mrunit/MapReduceDriver.java
+++ b/src/main/java/org/apache/hadoop/mrunit/MapReduceDriver.java
@@ -428,6 +428,12 @@
     super.withCounter(g, n, e);
     return this;
   }
+  
+  @Override
+  public MapReduceDriver<K1, V1, K2, V2, K3, V3> withStrictCounterChecking() {
+    super.withStrictCounterChecking();
+    return this;
+  }
 
   /**
    * Returns a new MapReduceDriver without having to specify the generic types
diff --git a/src/main/java/org/apache/hadoop/mrunit/PipelineMapReduceDriver.java b/src/main/java/org/apache/hadoop/mrunit/PipelineMapReduceDriver.java
index d9b5d28..be797a4 100644
--- a/src/main/java/org/apache/hadoop/mrunit/PipelineMapReduceDriver.java
+++ b/src/main/java/org/apache/hadoop/mrunit/PipelineMapReduceDriver.java
@@ -291,6 +291,12 @@
     super.withCounter(g, n, e);
     return this;
   }
+  
+  @Override
+  public PipelineMapReduceDriver<K1, V1, K2, V2> withStrictCounterChecking() {
+    super.withStrictCounterChecking();
+    return this;
+  }
 
   /**
    * Expects an input of the form "key \t val" Forces the Reducer output types
diff --git a/src/main/java/org/apache/hadoop/mrunit/ReduceDriver.java b/src/main/java/org/apache/hadoop/mrunit/ReduceDriver.java
index fd2b7c0..0f49dde 100644
--- a/src/main/java/org/apache/hadoop/mrunit/ReduceDriver.java
+++ b/src/main/java/org/apache/hadoop/mrunit/ReduceDriver.java
@@ -227,6 +227,12 @@
     super.withCounter(g, n, e);
     return this;
   }
+  
+  @Override
+  public ReduceDriver<K1, V1, K2, V2> withStrictCounterChecking() {
+    super.withStrictCounterChecking();
+    return this;
+  }
 
   public ReduceDriver<K1, V1, K2, V2> withOutputCopyingOrInputFormatConfiguration(
       Configuration configuration) {
diff --git a/src/main/java/org/apache/hadoop/mrunit/TestDriver.java b/src/main/java/org/apache/hadoop/mrunit/TestDriver.java
index 3ebe85e..4555fca 100644
--- a/src/main/java/org/apache/hadoop/mrunit/TestDriver.java
+++ b/src/main/java/org/apache/hadoop/mrunit/TestDriver.java
@@ -22,6 +22,7 @@
 
 import java.io.IOException;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -41,6 +42,7 @@
 
   protected List<Pair<K2, V2>> expectedOutputs;
 
+  private boolean strictCountersChecking = false;
   protected List<Pair<Enum<?>, Long>> expectedEnumCounters;
   protected List<Pair<Pair<String, String>, Long>> expectedStringCounters;
 
@@ -131,6 +133,19 @@
   }
 
   /**
+   * Change counter checking. After this method is called, the test will fail if
+   * an actual counter is not matched by an expected counter. By default, the
+   * test only check that every expected counter is there.
+   * 
+   * This mode allows you to ensure that no unexpected counters has been
+   * declared.
+   */
+  public TestDriver<K1, V1, K2, V2> withStrictCounterChecking() {
+    strictCountersChecking = true;
+    return this;
+  }
+
+  /**
    * @return The configuration object that will given to the mapper and/or
    *         reducer associated with the driver
    */
@@ -407,50 +422,76 @@
     LOG.error(msg);
     errors.add(msg);
   }
+  
+  /**
+   * Check counters.
+   */
+  protected void validate(final CounterWrapper counterWrapper) {
+    validateExpectedAgainstActual(counterWrapper);
+    validateActualAgainstExpected(counterWrapper);
+  }
 
   /**
-   * Check that passed counter do contain all expected counters with proper
+   * Same as {@link CounterWrapper#findCounterValues()} but for expectations.
+   */
+  private Collection<Pair<String, String>> findExpectedCounterValues() {
+    Collection<Pair<String, String>> results = new ArrayList<Pair<String, String>>();
+    for (Pair<Pair<String, String>,Long> counterAndCount : expectedStringCounters) {
+      results.add(counterAndCount.getFirst());
+    }
+    for (Pair<Enum<?>,Long> counterAndCount : expectedEnumCounters) {
+      Enum<?> first = counterAndCount.getFirst();
+      String groupName = first.getDeclaringClass().getName();
+      String counterName = first.name();
+      results.add(new Pair<String, String>(groupName, counterName));
+    }
+    return results;
+  }
+
+  /**
+   * Check that provided actual counters contain all expected counters with proper
    * values.
    * 
    * @param counterWrapper
    */
-  protected void validate(final CounterWrapper counterWrapper) {
+  private void validateExpectedAgainstActual(
+      final CounterWrapper counterWrapper) {
     boolean success = true;
     final List<String> errors = new ArrayList<String>();
-
+  
     // Firstly check enumeration based counters
     for (final Pair<Enum<?>, Long> expected : expectedEnumCounters) {
       final long actualValue = counterWrapper.findCounterValue(expected
           .getFirst());
-
+  
       if (actualValue != expected.getSecond()) {
         final String msg = "Counter "
             + expected.getFirst().getDeclaringClass().getCanonicalName() + "."
             + expected.getFirst().toString() + " have value " + actualValue
             + " instead of expected " + expected.getSecond();
         logError(errors, msg);
-
+  
         success = false;
       }
     }
-
+  
     // Second string based counters
     for (final Pair<Pair<String, String>, Long> expected : expectedStringCounters) {
       final Pair<String, String> counter = expected.getFirst();
-
+  
       final long actualValue = counterWrapper.findCounterValue(
           counter.getFirst(), counter.getSecond());
-
+  
       if (actualValue != expected.getSecond()) {
         final String msg = "Counter with category " + counter.getFirst()
             + " and name " + counter.getSecond() + " have value " + actualValue
             + " instead of expected " + expected.getSecond();
         logError(errors, msg);
-
+  
         success = false;
       }
     }
-
+  
     if (!success) {
       final StringBuilder buffer = new StringBuilder();
       buffer.append(errors.size()).append(" Error(s): ");
@@ -459,6 +500,34 @@
     }
   }
 
+  /**
+   * Check that provided actual counters are all expected.
+   * 
+   * @param counterWrapper
+   */
+  private void validateActualAgainstExpected(final CounterWrapper counterWrapper) {
+    if (strictCountersChecking) {
+      final List<String> errors = new ArrayList<String>();
+      Collection<Pair<String, String>> unmatchedCounters = counterWrapper.findCounterValues();
+      Collection<Pair<String, String>> findExpectedCounterValues = findExpectedCounterValues();
+      unmatchedCounters.removeAll(findExpectedCounterValues);
+      if(!unmatchedCounters.isEmpty()) {
+        for (Pair<String, String> unmatcherCounter : unmatchedCounters) {
+          final String msg = "Actual counter (\"" + unmatcherCounter.getFirst()
+              + "\",\"" + unmatcherCounter.getSecond()
+              + "\") was not found in expected counters";
+          logError(errors, msg);
+        }
+      }
+      if (!errors.isEmpty()) {
+        final StringBuilder buffer = new StringBuilder();
+        buffer.append(errors.size()).append(" Error(s): ");
+        formatValueList(errors, buffer);
+        fail(buffer.toString());
+      }
+    }
+  }
+
   protected static void formatValueList(final List<?> values,
       final StringBuilder sb) {
     sb.append("(");
diff --git a/src/main/java/org/apache/hadoop/mrunit/internal/counters/CounterWrapper.java b/src/main/java/org/apache/hadoop/mrunit/internal/counters/CounterWrapper.java
index b72b342..9e3b88a 100644
--- a/src/main/java/org/apache/hadoop/mrunit/internal/counters/CounterWrapper.java
+++ b/src/main/java/org/apache/hadoop/mrunit/internal/counters/CounterWrapper.java
@@ -19,6 +19,15 @@
 
 import static org.apache.hadoop.mrunit.internal.util.ArgumentChecker.returnNonNull;
 
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.LinkedList;
+
+import org.apache.hadoop.mapred.Counters.Group;
+import org.apache.hadoop.mapreduce.Counter;
+import org.apache.hadoop.mapreduce.CounterGroup;
+import org.apache.hadoop.mrunit.types.Pair;
+
 /**
  * Wrapper around Counters from both mapred and mapreduce packages so that we
  * can work with both counter classes in the same way.
@@ -81,4 +90,41 @@
       return mapreduce.findCounter(group, name).getValue();
     }
   }
+
+  public Collection<String> getGroupNames() {
+    if (mapred != null) {
+      return mapred.getGroupNames();
+    } else {
+      return mapreduce.getGroupNames();
+    }
+  }
+
+  /**
+   * @return the name of all counters
+   */
+  public Collection<Pair<String, String>> findCounterValues() {
+    final Collection<Pair<String, String>> counters = new LinkedList<Pair<String, String>>();
+    final Collection<String> groupNames = getGroupNames();
+    if (mapred != null) {
+      for (String groupName : groupNames) {
+        final Group group = mapred.getGroup(groupName);
+        collectCounters(counters, groupName, group.iterator());
+      }
+    } else {
+      for (String groupName : groupNames) {
+        final CounterGroup group = mapreduce.getGroup(groupName);
+        collectCounters(counters, groupName, group.iterator());
+      }
+    }
+    return counters;
+  }
+
+  /** Collect counters, same for both APIs **/
+  private void collectCounters(final Collection<Pair<String, String>> counters,
+      String groupName, Iterator<? extends Counter> iterator) {
+    while (iterator.hasNext()) {
+      String counter = iterator.next().getName();
+      counters.add(new Pair<String, String>(groupName, counter));
+    }
+  }
 }
diff --git a/src/main/java/org/apache/hadoop/mrunit/mapreduce/MapDriver.java b/src/main/java/org/apache/hadoop/mrunit/mapreduce/MapDriver.java
index 5f649da..b4df326 100644
--- a/src/main/java/org/apache/hadoop/mrunit/mapreduce/MapDriver.java
+++ b/src/main/java/org/apache/hadoop/mrunit/mapreduce/MapDriver.java
@@ -337,6 +337,12 @@
     super.withCounter(g, n, expectedValue);
     return this;
   }
+  
+  @Override
+  public MapDriver<K1, V1, K2, V2> withStrictCounterChecking() {
+    super.withStrictCounterChecking();
+    return this;
+  }
 
   /**
    * Returns a new MapDriver without having to specify the generic types on the
diff --git a/src/main/java/org/apache/hadoop/mrunit/mapreduce/MapReduceDriver.java b/src/main/java/org/apache/hadoop/mrunit/mapreduce/MapReduceDriver.java
index cf8d907..b46f757 100644
--- a/src/main/java/org/apache/hadoop/mrunit/mapreduce/MapReduceDriver.java
+++ b/src/main/java/org/apache/hadoop/mrunit/mapreduce/MapReduceDriver.java
@@ -453,6 +453,12 @@
     super.withCounter(g, n, e);
     return this;
   }
+  
+  @Override
+  public MapReduceDriver<K1, V1, K2, V2, K3, V3> withStrictCounterChecking() {
+    super.withStrictCounterChecking();
+    return this;
+  }
 
   /**
    * Returns a new MapReduceDriver without having to specify the generic types
diff --git a/src/main/java/org/apache/hadoop/mrunit/mapreduce/ReduceDriver.java b/src/main/java/org/apache/hadoop/mrunit/mapreduce/ReduceDriver.java
index a6f447e..024df72 100644
--- a/src/main/java/org/apache/hadoop/mrunit/mapreduce/ReduceDriver.java
+++ b/src/main/java/org/apache/hadoop/mrunit/mapreduce/ReduceDriver.java
@@ -325,6 +325,12 @@
     return this;
   }
   
+  @Override
+  public ReduceDriver<K1, V1, K2, V2> withStrictCounterChecking() {
+    super.withStrictCounterChecking();
+    return this;
+  }
+  
   /**
    * <p>Obtain Context object for furthering mocking with Mockito.
    * For example, causing write() to throw an exception:</p>
diff --git a/src/test/java/org/apache/hadoop/mrunit/TestMapDriver.java b/src/test/java/org/apache/hadoop/mrunit/TestMapDriver.java
index 7015d1f..bfd72cf 100644
--- a/src/test/java/org/apache/hadoop/mrunit/TestMapDriver.java
+++ b/src/test/java/org/apache/hadoop/mrunit/TestMapDriver.java
@@ -281,6 +281,50 @@
         .withCounter(MapperWithCounters.Counters.X, 1)
         .withCounter("category", "name", 1).runTest();
   }
+  
+  @Test
+  public void testWithCounterAndNoneMissing() throws IOException {
+    MapDriver<Text, Text, Text, Text> driver = MapDriver.newMapDriver();
+
+    driver.withMapper(new MapperWithCounters<Text, Text, Text, Text>())
+        .withInput(new Text("hie"), new Text("Hi"))
+        .withOutput(new Text("hie"), new Text("Hi"))
+        .withStrictCounterChecking()
+        .withCounter(MapperWithCounters.Counters.X, 1)
+        .withCounter("category", "name", 1).runTest();
+  }
+
+  @Test
+  public void testWithCounterAndEnumCounterMissing() throws IOException {
+    MapDriver<Text, Text, Text, Text> driver = MapDriver.newMapDriver();
+    
+    thrown
+        .expectAssertionErrorMessage("1 Error(s): (Actual counter ("
+            + "\"org.apache.hadoop.mrunit.TestMapDriver$MapperWithCounters$Counters\",\"X\")"
+            + " was not found in expected counters");
+
+    driver.withMapper(new MapperWithCounters<Text, Text, Text, Text>())
+        .withInput(new Text("hie"), new Text("Hi"))
+        .withOutput(new Text("hie"), new Text("Hi"))
+        .withStrictCounterChecking().withCounter("category", "name", 1)
+        .runTest();
+  }
+
+  @Test
+  public void testWithCounterAndStringCounterMissing() throws IOException {
+    MapDriver<Text, Text, Text, Text> driver = MapDriver.newMapDriver();
+    
+    thrown
+    .expectAssertionErrorMessage("1 Error(s): (Actual counter ("
+        + "\"category\",\"name\")"
+        + " was not found in expected counters");
+
+    driver.withMapper(new MapperWithCounters<Text, Text, Text, Text>())
+        .withInput(new Text("hie"), new Text("Hi"))
+        .withOutput(new Text("hie"), new Text("Hi"))
+        .withStrictCounterChecking()
+        .withCounter(MapperWithCounters.Counters.X, 1).runTest();
+  }
 
   @Test
   public void testWithFailedCounter() throws IOException {
diff --git a/src/test/java/org/apache/hadoop/mrunit/TestMapReduceDriver.java b/src/test/java/org/apache/hadoop/mrunit/TestMapReduceDriver.java
index 7c6cd88..8fc9ae0 100644
--- a/src/test/java/org/apache/hadoop/mrunit/TestMapReduceDriver.java
+++ b/src/test/java/org/apache/hadoop/mrunit/TestMapReduceDriver.java
@@ -391,6 +391,75 @@
         .withCounter("category", "count", 1).withCounter("category", "sum", 1)
         .runTest();
   }
+  
+  @Test
+  public void testWithCounterAndNoneMissing() throws IOException {
+    MapReduceDriver<Text, Text, Text, Text, Text, Text> driver = MapReduceDriver
+        .newMapReduceDriver();
+
+    driver
+        .withMapper(
+            new TestMapDriver.MapperWithCounters<Text, Text, Text, Text>())
+        .withInput(new Text("hie"), new Text("Hi"))
+        .withOutput(new Text("hie"), new Text("Hi"))
+        .withStrictCounterChecking()
+        .withCounter(TestMapDriver.MapperWithCounters.Counters.X, 1)
+        .withCounter("category", "name", 1)
+        .withReducer(
+            new TestReduceDriver.ReducerWithCounters<Text, Text, Text, Text>())
+        .withCounter(TestReduceDriver.ReducerWithCounters.Counters.COUNT, 1)
+        .withCounter(TestReduceDriver.ReducerWithCounters.Counters.SUM, 1)
+        .withCounter("category", "count", 1).withCounter("category", "sum", 1)
+        .runTest();
+  }
+
+  @Test
+  public void testWithCounterAndEnumCounterMissing() throws IOException {
+    MapReduceDriver<Text, Text, Text, Text, Text, Text> driver = MapReduceDriver
+        .newMapReduceDriver();
+
+    thrown
+        .expectAssertionErrorMessage("1 Error(s): (Actual counter ("
+            + "\"org.apache.hadoop.mrunit.TestMapDriver$MapperWithCounters$Counters\",\"X\")"
+            + " was not found in expected counters");
+
+    driver
+        .withMapper(
+            new TestMapDriver.MapperWithCounters<Text, Text, Text, Text>())
+        .withInput(new Text("hie"), new Text("Hi"))
+        .withOutput(new Text("hie"), new Text("Hi"))
+        .withStrictCounterChecking()
+        .withCounter("category", "name", 1)
+        .withReducer(
+            new TestReduceDriver.ReducerWithCounters<Text, Text, Text, Text>())
+        .withCounter(TestReduceDriver.ReducerWithCounters.Counters.COUNT, 1)
+        .withCounter(TestReduceDriver.ReducerWithCounters.Counters.SUM, 1)
+        .withCounter("category", "count", 1).withCounter("category", "sum", 1)
+        .runTest();
+  }
+
+  @Test
+  public void testWithCounterAndStringCounterMissing() throws IOException {
+    MapReduceDriver<Text, Text, Text, Text, Text, Text> driver = MapReduceDriver
+        .newMapReduceDriver();
+
+    thrown.expectAssertionErrorMessage("1 Error(s): (Actual counter ("
+        + "\"category\",\"name\")" + " was not found in expected counters");
+
+    driver
+        .withMapper(
+            new TestMapDriver.MapperWithCounters<Text, Text, Text, Text>())
+        .withInput(new Text("hie"), new Text("Hi"))
+        .withOutput(new Text("hie"), new Text("Hi"))
+        .withStrictCounterChecking()
+        .withCounter(TestMapDriver.MapperWithCounters.Counters.X, 1)
+        .withReducer(
+            new TestReduceDriver.ReducerWithCounters<Text, Text, Text, Text>())
+        .withCounter(TestReduceDriver.ReducerWithCounters.Counters.COUNT, 1)
+        .withCounter(TestReduceDriver.ReducerWithCounters.Counters.SUM, 1)
+        .withCounter("category", "count", 1).withCounter("category", "sum", 1)
+        .runTest();
+  }
 
   @Test
   public void testWithFailedCounter() throws IOException {
diff --git a/src/test/java/org/apache/hadoop/mrunit/TestPipelineMapReduceDriver.java b/src/test/java/org/apache/hadoop/mrunit/TestPipelineMapReduceDriver.java
index d56f955..f230ab8 100644
--- a/src/test/java/org/apache/hadoop/mrunit/TestPipelineMapReduceDriver.java
+++ b/src/test/java/org/apache/hadoop/mrunit/TestPipelineMapReduceDriver.java
@@ -166,6 +166,80 @@
         .withCounter("category", "count", 2).withCounter("category", "sum", 2)
         .runTest();
   }
+  
+  @Test
+  public void testWithCounterAndNoneMissing() throws IOException {
+    final PipelineMapReduceDriver<Text, Text, Text, Text> driver = PipelineMapReduceDriver.newPipelineMapReduceDriver();
+
+    driver.addMapReduce(
+        new TestMapDriver.MapperWithCounters<Text, Text, Text, Text>(),
+        new TestReduceDriver.ReducerWithCounters<Text, Text, Text, Text>());
+    driver.addMapReduce(
+        new TestMapDriver.MapperWithCounters<Text, Text, Text, Text>(),
+        new TestReduceDriver.ReducerWithCounters<Text, Text, Text, Text>());
+
+    driver.withInput(new Text("hie"), new Text("Hi"))
+        .withOutput(new Text("hie"), new Text("Hi"))
+        .withStrictCounterChecking()
+        .withCounter(TestMapDriver.MapperWithCounters.Counters.X, 2)
+        .withCounter("category", "name", 2)
+        .withCounter(TestReduceDriver.ReducerWithCounters.Counters.COUNT, 2)
+        .withCounter(TestReduceDriver.ReducerWithCounters.Counters.SUM, 2)
+        .withCounter("category", "count", 2).withCounter("category", "sum", 2)
+        .runTest();
+  }
+
+  @Test
+  public void testWithCounterAndEnumCounterMissing() throws IOException {
+    final PipelineMapReduceDriver<Text, Text, Text, Text> driver = PipelineMapReduceDriver.newPipelineMapReduceDriver();
+
+    thrown
+        .expectAssertionErrorMessage("1 Error(s): (Actual counter ("
+            + "\"org.apache.hadoop.mrunit.TestMapDriver$MapperWithCounters$Counters\",\"X\")"
+            + " was not found in expected counters");
+
+    driver.addMapReduce(
+        new TestMapDriver.MapperWithCounters<Text, Text, Text, Text>(),
+        new TestReduceDriver.ReducerWithCounters<Text, Text, Text, Text>());
+    driver.addMapReduce(
+        new TestMapDriver.MapperWithCounters<Text, Text, Text, Text>(),
+        new TestReduceDriver.ReducerWithCounters<Text, Text, Text, Text>());
+
+    driver.withInput(new Text("hie"), new Text("Hi"))
+        .withOutput(new Text("hie"), new Text("Hi"))
+        .withStrictCounterChecking()
+        .withCounter("category", "name", 2)
+        .withCounter(TestReduceDriver.ReducerWithCounters.Counters.COUNT, 2)
+        .withCounter(TestReduceDriver.ReducerWithCounters.Counters.SUM, 2)
+        .withCounter("category", "count", 2).withCounter("category", "sum", 2)
+        .runTest();
+  }
+
+  @Test
+  public void testWithCounterAndStringCounterMissing() throws IOException {
+    final PipelineMapReduceDriver<Text, Text, Text, Text> driver = PipelineMapReduceDriver.newPipelineMapReduceDriver();
+
+    thrown
+        .expectAssertionErrorMessage("1 Error(s): (Actual counter ("
+            + "\"category\",\"name\")"
+            + " was not found in expected counters");
+
+    driver.addMapReduce(
+        new TestMapDriver.MapperWithCounters<Text, Text, Text, Text>(),
+        new TestReduceDriver.ReducerWithCounters<Text, Text, Text, Text>());
+    driver.addMapReduce(
+        new TestMapDriver.MapperWithCounters<Text, Text, Text, Text>(),
+        new TestReduceDriver.ReducerWithCounters<Text, Text, Text, Text>());
+
+    driver.withInput(new Text("hie"), new Text("Hi"))
+        .withOutput(new Text("hie"), new Text("Hi"))
+        .withStrictCounterChecking()
+        .withCounter(TestMapDriver.MapperWithCounters.Counters.X, 2)
+        .withCounter(TestReduceDriver.ReducerWithCounters.Counters.COUNT, 2)
+        .withCounter(TestReduceDriver.ReducerWithCounters.Counters.SUM, 2)
+        .withCounter("category", "count", 2).withCounter("category", "sum", 2)
+        .runTest();
+  }
 
   @Test
   public void testWithFailedCounter() throws IOException {
diff --git a/src/test/java/org/apache/hadoop/mrunit/TestReduceDriver.java b/src/test/java/org/apache/hadoop/mrunit/TestReduceDriver.java
index 1e83c60..110954c 100644
--- a/src/test/java/org/apache/hadoop/mrunit/TestReduceDriver.java
+++ b/src/test/java/org/apache/hadoop/mrunit/TestReduceDriver.java
@@ -326,6 +326,69 @@
         .withCounter("category", "count", 1).withCounter("category", "sum", 2)
         .runTest();
   }
+  
+  @Test
+  public void testWithCounterAndNoneMissing() throws IOException {
+    final ReduceDriver<Text, Text, Text, Text> driver = ReduceDriver
+        .newReduceDriver();
+
+    final LinkedList<Text> values = new LinkedList<Text>();
+    values.add(new Text("a"));
+    values.add(new Text("b"));
+
+    driver.withReducer(new ReducerWithCounters<Text, Text, Text, Text>())
+        .withInput(new Text("hie"), values)
+        .withOutput(new Text("hie"), new Text("a"))
+        .withOutput(new Text("hie"), new Text("b")).withStrictCounterChecking()
+        .withCounter(ReducerWithCounters.Counters.COUNT, 1)
+        .withCounter(ReducerWithCounters.Counters.SUM, 2)
+        .withCounter("category", "count", 1).withCounter("category", "sum", 2)
+        .runTest();
+  }
+
+  @Test
+  public void testWithCounterAndEnumCounterMissing() throws IOException {
+    final ReduceDriver<Text, Text, Text, Text> driver = ReduceDriver
+        .newReduceDriver();
+
+    thrown
+        .expectAssertionErrorMessage("1 Error(s): (Actual counter ("
+            + "\"org.apache.hadoop.mrunit.TestReduceDriver$ReducerWithCounters$Counters\",\"COUNT\")"
+            + " was not found in expected counters");
+
+    final LinkedList<Text> values = new LinkedList<Text>();
+    values.add(new Text("a"));
+    values.add(new Text("b"));
+
+    driver.withReducer(new ReducerWithCounters<Text, Text, Text, Text>())
+        .withInput(new Text("hie"), values)
+        .withOutput(new Text("hie"), new Text("a"))
+        .withOutput(new Text("hie"), new Text("b")).withStrictCounterChecking()
+        .withCounter(ReducerWithCounters.Counters.SUM, 2)
+        .withCounter("category", "count", 1).withCounter("category", "sum", 2)
+        .runTest();
+  }
+
+  @Test
+  public void testWithCounterAndStringCounterMissing() throws IOException {
+    final ReduceDriver<Text, Text, Text, Text> driver = ReduceDriver
+        .newReduceDriver();
+
+    thrown.expectAssertionErrorMessage("1 Error(s): (Actual counter ("
+        + "\"category\",\"count\")" + " was not found in expected counters");
+
+    final LinkedList<Text> values = new LinkedList<Text>();
+    values.add(new Text("a"));
+    values.add(new Text("b"));
+
+    driver.withReducer(new ReducerWithCounters<Text, Text, Text, Text>())
+        .withInput(new Text("hie"), values)
+        .withOutput(new Text("hie"), new Text("a"))
+        .withOutput(new Text("hie"), new Text("b")).withStrictCounterChecking()
+        .withCounter(ReducerWithCounters.Counters.COUNT, 1)
+        .withCounter(ReducerWithCounters.Counters.SUM, 2)
+        .withCounter("category", "sum", 2).runTest();
+  }
 
   @Test
   public void testWithFailedEnumCounter() throws IOException {
diff --git a/src/test/java/org/apache/hadoop/mrunit/mapreduce/TestMapDriver.java b/src/test/java/org/apache/hadoop/mrunit/mapreduce/TestMapDriver.java
index df96dd3..ef7ae14 100644
--- a/src/test/java/org/apache/hadoop/mrunit/mapreduce/TestMapDriver.java
+++ b/src/test/java/org/apache/hadoop/mrunit/mapreduce/TestMapDriver.java
@@ -222,6 +222,50 @@
         .withCounter(MapperWithCounters.Counters.X, 1)
         .withCounter("category", "name", 1).runTest();
   }
+  
+  @Test
+  public void testWithCounterAndNoneMissing() throws IOException {
+    MapDriver<Text, Text, Text, Text> driver = MapDriver.newMapDriver();
+
+    driver.withMapper(new MapperWithCounters<Text, Text, Text, Text>())
+        .withInput(new Text("hie"), new Text("Hi"))
+        .withOutput(new Text("hie"), new Text("Hi"))
+        .withStrictCounterChecking()
+        .withCounter(MapperWithCounters.Counters.X, 1)
+        .withCounter("category", "name", 1).runTest();
+  }
+
+  @Test
+  public void testWithCounterAndEnumCounterMissing() throws IOException {
+    MapDriver<Text, Text, Text, Text> driver = MapDriver.newMapDriver();
+    
+    thrown
+        .expectAssertionErrorMessage("1 Error(s): (Actual counter ("
+            + "\"org.apache.hadoop.mrunit.mapreduce.TestMapDriver$MapperWithCounters$Counters\",\"X\")"
+            + " was not found in expected counters");
+
+    driver.withMapper(new MapperWithCounters<Text, Text, Text, Text>())
+        .withInput(new Text("hie"), new Text("Hi"))
+        .withOutput(new Text("hie"), new Text("Hi"))
+        .withStrictCounterChecking().withCounter("category", "name", 1)
+        .runTest();
+  }
+
+  @Test
+  public void testWithCounterAndStringCounterMissing() throws IOException {
+    MapDriver<Text, Text, Text, Text> driver = MapDriver.newMapDriver();
+    
+    thrown
+    .expectAssertionErrorMessage("1 Error(s): (Actual counter ("
+        + "\"category\",\"name\")"
+        + " was not found in expected counters");
+
+    driver.withMapper(new MapperWithCounters<Text, Text, Text, Text>())
+        .withInput(new Text("hie"), new Text("Hi"))
+        .withOutput(new Text("hie"), new Text("Hi"))
+        .withStrictCounterChecking()
+        .withCounter(MapperWithCounters.Counters.X, 1).runTest();
+  }
 
   @Test
   public void testWithFailedCounter() throws IOException {
diff --git a/src/test/java/org/apache/hadoop/mrunit/mapreduce/TestMapReduceDriver.java b/src/test/java/org/apache/hadoop/mrunit/mapreduce/TestMapReduceDriver.java
index f0519d8..f40441e 100644
--- a/src/test/java/org/apache/hadoop/mrunit/mapreduce/TestMapReduceDriver.java
+++ b/src/test/java/org/apache/hadoop/mrunit/mapreduce/TestMapReduceDriver.java
@@ -368,6 +368,72 @@
         .withCounter("category", "count", 1).withCounter("category", "sum", 1)
         .runTest();
   }
+  
+  @Test
+  public void testWithCounterAndNoneMissing() throws IOException {
+    MapReduceDriver<Text, Text, Text, Text, Text, Text> driver = MapReduceDriver
+        .newMapReduceDriver();
+
+    driver
+        .withMapper(
+            new TestMapDriver.MapperWithCounters<Text, Text, Text, Text>())
+        .withInput(new Text("hie"), new Text("Hi"))
+        .withStrictCounterChecking()
+        .withCounter(TestMapDriver.MapperWithCounters.Counters.X, 1)
+        .withCounter("category", "name", 1)
+        .withReducer(
+            new TestReduceDriver.ReducerWithCounters<Text, Text, Text, Text>())
+        .withCounter(TestReduceDriver.ReducerWithCounters.Counters.COUNT, 1)
+        .withCounter(TestReduceDriver.ReducerWithCounters.Counters.SUM, 1)
+        .withCounter("category", "count", 1).withCounter("category", "sum", 1)
+        .runTest();
+  }
+
+  @Test
+  public void testWithCounterAndEnumCounterMissing() throws IOException {
+    MapReduceDriver<Text, Text, Text, Text, Text, Text> driver = MapReduceDriver
+        .newMapReduceDriver();
+
+    thrown
+        .expectAssertionErrorMessage("1 Error(s): (Actual counter ("
+            + "\"org.apache.hadoop.mrunit.mapreduce.TestMapDriver$MapperWithCounters$Counters\",\"X\")"
+            + " was not found in expected counters");
+
+    driver
+        .withMapper(
+            new TestMapDriver.MapperWithCounters<Text, Text, Text, Text>())
+        .withInput(new Text("hie"), new Text("Hi"))
+        .withStrictCounterChecking()
+        .withCounter("category", "name", 1)
+        .withReducer(
+            new TestReduceDriver.ReducerWithCounters<Text, Text, Text, Text>())
+        .withCounter(TestReduceDriver.ReducerWithCounters.Counters.COUNT, 1)
+        .withCounter(TestReduceDriver.ReducerWithCounters.Counters.SUM, 1)
+        .withCounter("category", "count", 1).withCounter("category", "sum", 1)
+        .runTest();
+  }
+
+  @Test
+  public void testWithCounterAndStringCounterMissing() throws IOException {
+    MapReduceDriver<Text, Text, Text, Text, Text, Text> driver = MapReduceDriver
+        .newMapReduceDriver();
+
+    thrown.expectAssertionErrorMessage("1 Error(s): (Actual counter ("
+        + "\"category\",\"name\")" + " was not found in expected counters");
+
+    driver
+        .withMapper(
+            new TestMapDriver.MapperWithCounters<Text, Text, Text, Text>())
+        .withInput(new Text("hie"), new Text("Hi"))
+        .withStrictCounterChecking()
+        .withCounter(TestMapDriver.MapperWithCounters.Counters.X, 1)
+        .withReducer(
+            new TestReduceDriver.ReducerWithCounters<Text, Text, Text, Text>())
+        .withCounter(TestReduceDriver.ReducerWithCounters.Counters.COUNT, 1)
+        .withCounter(TestReduceDriver.ReducerWithCounters.Counters.SUM, 1)
+        .withCounter("category", "count", 1).withCounter("category", "sum", 1)
+        .runTest();
+  }
 
   @Test
   public void testWithFailedCounter() throws IOException {
diff --git a/src/test/java/org/apache/hadoop/mrunit/mapreduce/TestReduceDriver.java b/src/test/java/org/apache/hadoop/mrunit/mapreduce/TestReduceDriver.java
index bd0a6a2..b5b1089 100644
--- a/src/test/java/org/apache/hadoop/mrunit/mapreduce/TestReduceDriver.java
+++ b/src/test/java/org/apache/hadoop/mrunit/mapreduce/TestReduceDriver.java
@@ -321,6 +321,63 @@
         .withCounter("category", "count", 1).withCounter("category", "sum", 2)
         .runTest();
   }
+  
+  @Test
+  public void testWithCounterAndNoneMissing() throws IOException {
+    final ReduceDriver<Text, Text, Text, Text> driver = ReduceDriver
+        .newReduceDriver();
+
+    final LinkedList<Text> values = new LinkedList<Text>();
+    values.add(new Text("a"));
+    values.add(new Text("b"));
+
+    driver.withReducer(new ReducerWithCounters<Text, Text, Text, Text>())
+        .withInput(new Text("hie"), values).withStrictCounterChecking()
+        .withCounter(ReducerWithCounters.Counters.COUNT, 1)
+        .withCounter(ReducerWithCounters.Counters.SUM, 2)
+        .withCounter("category", "count", 1).withCounter("category", "sum", 2)
+        .runTest();
+  }
+
+  @Test
+  public void testWithCounterAndEnumCounterMissing() throws IOException {
+    final ReduceDriver<Text, Text, Text, Text> driver = ReduceDriver
+        .newReduceDriver();
+
+    thrown
+        .expectAssertionErrorMessage("1 Error(s): (Actual counter ("
+            + "\"org.apache.hadoop.mrunit.mapreduce.TestReduceDriver$ReducerWithCounters$Counters\",\"COUNT\")"
+            + " was not found in expected counters");
+
+    final LinkedList<Text> values = new LinkedList<Text>();
+    values.add(new Text("a"));
+    values.add(new Text("b"));
+
+    driver.withReducer(new ReducerWithCounters<Text, Text, Text, Text>())
+        .withInput(new Text("hie"), values).withStrictCounterChecking()
+        .withCounter(ReducerWithCounters.Counters.SUM, 2)
+        .withCounter("category", "count", 1).withCounter("category", "sum", 2)
+        .runTest();
+  }
+
+  @Test
+  public void testWithCounterAndStringCounterMissing() throws IOException {
+    final ReduceDriver<Text, Text, Text, Text> driver = ReduceDriver
+        .newReduceDriver();
+
+    thrown.expectAssertionErrorMessage("1 Error(s): (Actual counter ("
+        + "\"category\",\"count\")" + " was not found in expected counters");
+
+    final LinkedList<Text> values = new LinkedList<Text>();
+    values.add(new Text("a"));
+    values.add(new Text("b"));
+
+    driver.withReducer(new ReducerWithCounters<Text, Text, Text, Text>())
+        .withInput(new Text("hie"), values).withStrictCounterChecking()
+        .withCounter(ReducerWithCounters.Counters.COUNT, 1)
+        .withCounter(ReducerWithCounters.Counters.SUM, 2)
+        .withCounter("category", "sum", 2).runTest();
+  }
 
   @Test
   public void testWithFailedCounter() throws IOException {
