diff --git a/src/test/java/com/googlesource/gerrit/plugins/its/base/its/ItsConfigTest.java b/src/test/java/com/googlesource/gerrit/plugins/its/base/its/ItsConfigTest.java
index 92eb61f..34068bb 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/its/base/its/ItsConfigTest.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/its/base/its/ItsConfigTest.java
@@ -14,8 +14,11 @@
 
 package com.googlesource.gerrit.plugins.its.base.its;
 
-import static org.easymock.EasyMock.eq;
-import static org.easymock.EasyMock.expect;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.atLeastOnce;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
 
 import com.google.common.base.Suppliers;
 import com.google.gerrit.entities.Project;
@@ -51,57 +54,53 @@
 
   public void setupIsEnabled(
       String enabled, String itsProject, String parentEnabled, String[] branches) {
-    ProjectState projectState = createMock(ProjectState.class);
+    ProjectState projectState = mock(ProjectState.class);
 
-    expect(projectCache.get(Project.nameKey("testProject"))).andReturn(projectState).anyTimes();
-    expect(projectCache.get(Project.nameKey("parentProject"))).andReturn(projectState).anyTimes();
+    when(projectCache.get(Project.nameKey("testProject"))).thenReturn(Optional.of(projectState));
+    when(projectCache.get(Project.nameKey("parentProject"))).thenReturn(Optional.of(projectState));
 
     Iterable<ProjectState> parents;
     if (parentEnabled == null) {
       parents = Arrays.asList(projectState);
     } else {
-      ProjectState parentProjectState = createMock(ProjectState.class);
+      ProjectState parentProjectState = mock(ProjectState.class);
 
-      PluginConfig parentPluginConfig = createMock(PluginConfig.class);
+      PluginConfig parentPluginConfig = mock(PluginConfig.class);
 
-      expect(pluginConfigFactory.getFromProjectConfig(parentProjectState, "ItsTestName"))
-          .andReturn(parentPluginConfig);
+      when(pluginConfigFactory.getFromProjectConfig(parentProjectState, "ItsTestName"))
+          .thenReturn(parentPluginConfig);
 
-      expect(parentPluginConfig.getString("enabled", "false")).andReturn(parentEnabled).anyTimes();
+      when(parentPluginConfig.getString("enabled", "false")).thenReturn(parentEnabled);
 
-      PluginConfig parentPluginConfigWI = createMock(PluginConfig.class);
+      PluginConfig parentPluginConfigWI = mock(PluginConfig.class);
 
-      expect(
-              pluginConfigFactory.getFromProjectConfigWithInheritance(
-                  parentProjectState, "ItsTestName"))
-          .andReturn(parentPluginConfigWI)
-          .anyTimes();
+      when(pluginConfigFactory.getFromProjectConfigWithInheritance(
+              parentProjectState, "ItsTestName"))
+          .thenReturn(parentPluginConfigWI);
 
       String[] parentBranches = {"refs/heads/testBranch"};
-      expect(parentPluginConfigWI.getStringList("branch")).andReturn(parentBranches).anyTimes();
+      when(parentPluginConfigWI.getStringList("branch")).thenReturn(parentBranches);
 
       parents = Arrays.asList(parentProjectState, projectState);
     }
-    expect(projectState.treeInOrder()).andReturn(parents).anyTimes();
+    when(projectState.treeInOrder()).thenReturn(parents);
 
-    PluginConfig pluginConfig = createMock(PluginConfig.class);
+    PluginConfig pluginConfig = mock(PluginConfig.class);
 
-    expect(pluginConfigFactory.getFromProjectConfig(projectState, "ItsTestName"))
-        .andReturn(pluginConfig)
-        .anyTimes();
+    when(pluginConfigFactory.getFromProjectConfig(projectState, "ItsTestName"))
+        .thenReturn(pluginConfig);
 
-    expect(pluginConfig.getString("enabled", "false")).andReturn(enabled).anyTimes();
-    expect(pluginConfig.getString(eq("its-project"))).andReturn(itsProject).anyTimes();
+    when(pluginConfig.getString("enabled", "false")).thenReturn(enabled);
+    when(pluginConfig.getString(eq("its-project"))).thenReturn(itsProject);
 
-    PluginConfig pluginConfigWI = createMock(PluginConfig.class);
+    PluginConfig pluginConfigWI = mock(PluginConfig.class);
 
-    expect(pluginConfigFactory.getFromProjectConfigWithInheritance(projectState, "ItsTestName"))
-        .andReturn(pluginConfigWI)
-        .anyTimes();
+    when(pluginConfigFactory.getFromProjectConfigWithInheritance(projectState, "ItsTestName"))
+        .thenReturn(pluginConfigWI);
 
-    expect(pluginConfigWI.getString("enabled", "false")).andReturn(enabled).anyTimes();
+    when(pluginConfigWI.getString("enabled", "false")).thenReturn(enabled);
 
-    expect(pluginConfigWI.getStringList("branch")).andReturn(branches).anyTimes();
+    when(pluginConfigWI.getStringList("branch")).thenReturn(branches);
   }
 
   public void testIsEnabledRefNoParentNoBranchEnabled() {
@@ -110,8 +109,6 @@
 
     ItsConfig itsConfig = createItsConfig();
 
-    replayMocks();
-
     Project.NameKey projectNK = Project.nameKey("testProject");
     assertTrue(itsConfig.isEnabled(projectNK, "refs/heads/testBranch"));
   }
@@ -122,8 +119,6 @@
 
     ItsConfig itsConfig = createItsConfig();
 
-    replayMocks();
-
     Project.NameKey projectNK = Project.nameKey("testProject");
     assertFalse(itsConfig.isEnabled(projectNK, "refs/heads/testBranch"));
   }
@@ -134,8 +129,6 @@
 
     ItsConfig itsConfig = createItsConfig();
 
-    replayMocks();
-
     Project.NameKey projectNK = Project.nameKey("testProject");
     assertTrue(itsConfig.isEnabled(projectNK, "refs/heads/testBranch"));
   }
@@ -146,8 +139,6 @@
 
     ItsConfig itsConfig = createItsConfig();
 
-    replayMocks();
-
     Project.NameKey projectNK = Project.nameKey("testProject");
     assertTrue(itsConfig.isEnabled(projectNK, "refs/heads/testBranch"));
   }
@@ -158,8 +149,6 @@
 
     ItsConfig itsConfig = createItsConfig();
 
-    replayMocks();
-
     Project.NameKey projectNK = Project.nameKey("testProject");
     assertFalse(itsConfig.isEnabled(projectNK, "refs/heads/testBranch"));
   }
@@ -170,8 +159,6 @@
 
     ItsConfig itsConfig = createItsConfig();
 
-    replayMocks();
-
     Project.NameKey projectNK = Project.nameKey("testProject");
     assertTrue(itsConfig.isEnabled(projectNK, "refs/heads/testBranch"));
   }
@@ -182,8 +169,6 @@
 
     ItsConfig itsConfig = createItsConfig();
 
-    replayMocks();
-
     Project.NameKey projectNK = Project.nameKey("testProject");
     assertFalse(itsConfig.isEnabled(projectNK, "refs/heads/testBranch"));
   }
@@ -194,8 +179,6 @@
 
     ItsConfig itsConfig = createItsConfig();
 
-    replayMocks();
-
     Project.NameKey projectNK = Project.nameKey("testProject");
     assertFalse(itsConfig.isEnabled(projectNK, "refs/heads/testBranch"));
   }
@@ -206,8 +189,6 @@
 
     ItsConfig itsConfig = createItsConfig();
 
-    replayMocks();
-
     Project.NameKey projectNK = Project.nameKey("testProject");
     assertFalse(itsConfig.isEnabled(projectNK, "refs/heads/testBranch"));
   }
@@ -218,8 +199,6 @@
 
     ItsConfig itsConfig = createItsConfig();
 
-    replayMocks();
-
     Project.NameKey projectNK = Project.nameKey("testProject");
     assertTrue(itsConfig.isEnabled(projectNK, "refs/heads/testBranch"));
   }
@@ -230,8 +209,6 @@
 
     ItsConfig itsConfig = createItsConfig();
 
-    replayMocks();
-
     Project.NameKey projectNK = Project.nameKey("testProject");
     assertFalse(itsConfig.isEnabled(projectNK, "refs/heads/testBranch"));
   }
@@ -242,8 +219,6 @@
 
     ItsConfig itsConfig = createItsConfig();
 
-    replayMocks();
-
     Project.NameKey projectNK = Project.nameKey("testProject");
     assertTrue(itsConfig.isEnabled(projectNK, "refs/heads/testBranch"));
   }
@@ -254,8 +229,6 @@
 
     ItsConfig itsConfig = createItsConfig();
 
-    replayMocks();
-
     Project.NameKey projectNK = Project.nameKey("testProject");
     assertFalse(itsConfig.isEnabled(projectNK, "refs/heads/testBranch"));
   }
@@ -266,8 +239,6 @@
 
     ItsConfig itsConfig = createItsConfig();
 
-    replayMocks();
-
     Project.NameKey projectNK = Project.nameKey("testProject");
     assertFalse(itsConfig.isEnabled(projectNK, "refs/heads/testBranch"));
   }
@@ -278,8 +249,6 @@
 
     ItsConfig itsConfig = createItsConfig();
 
-    replayMocks();
-
     Project.NameKey projectNK = Project.nameKey("testProject");
     assertTrue(itsConfig.isEnabled(projectNK, "refs/heads/testBranch"));
   }
@@ -292,8 +261,6 @@
 
     ItsConfig itsConfig = createItsConfig();
 
-    replayMocks();
-
     assertTrue(itsConfig.isEnabled(event));
   }
 
@@ -305,8 +272,6 @@
 
     ItsConfig itsConfig = createItsConfig();
 
-    replayMocks();
-
     assertTrue(itsConfig.isEnabled(event));
   }
 
@@ -318,8 +283,6 @@
 
     ItsConfig itsConfig = createItsConfig();
 
-    replayMocks();
-
     assertTrue(itsConfig.isEnabled(event));
   }
 
@@ -331,8 +294,6 @@
 
     ItsConfig itsConfig = createItsConfig();
 
-    replayMocks();
-
     assertFalse(itsConfig.isEnabled(event));
   }
 
@@ -344,8 +305,6 @@
 
     ItsConfig itsConfig = createItsConfig();
 
-    replayMocks();
-
     assertTrue(itsConfig.isEnabled(event));
   }
 
@@ -357,8 +316,6 @@
 
     ItsConfig itsConfig = createItsConfig();
 
-    replayMocks();
-
     assertTrue(itsConfig.isEnabled(event));
   }
 
@@ -370,8 +327,6 @@
 
     ItsConfig itsConfig = createItsConfig();
 
-    replayMocks();
-
     assertTrue(itsConfig.isEnabled(event));
   }
 
@@ -383,8 +338,6 @@
 
     ItsConfig itsConfig = createItsConfig();
 
-    replayMocks();
-
     assertTrue(itsConfig.isEnabled(event));
   }
 
@@ -396,8 +349,6 @@
 
     ItsConfig itsConfig = createItsConfig();
 
-    replayMocks();
-
     assertFalse(itsConfig.isEnabled(event));
   }
 
@@ -409,8 +360,6 @@
 
     ItsConfig itsConfig = createItsConfig();
 
-    replayMocks();
-
     assertTrue(itsConfig.isEnabled(event));
   }
 
@@ -422,8 +371,6 @@
 
     ItsConfig itsConfig = createItsConfig();
 
-    replayMocks();
-
     assertTrue(itsConfig.isEnabled(event));
   }
 
@@ -435,8 +382,6 @@
 
     ItsConfig itsConfig = createItsConfig();
 
-    replayMocks();
-
     assertTrue(itsConfig.isEnabled(event));
   }
 
@@ -448,8 +393,6 @@
 
     ItsConfig itsConfig = createItsConfig();
 
-    replayMocks();
-
     assertTrue(itsConfig.isEnabled(event));
   }
 
@@ -465,18 +408,14 @@
 
     ItsConfig itsConfig = createItsConfig();
 
-    replayMocks();
-
     assertTrue(itsConfig.isEnabled(event));
   }
 
   public void BROKEN_testIsEnabledUnknownEvent() {
-    RefEvent event = createMock(RefEvent.class);
+    RefEvent event = mock(RefEvent.class);
 
     ItsConfig itsConfig = createItsConfig();
 
-    replayMocks();
-
     assertFalse(itsConfig.isEnabled(event));
     assertLogMessageContains("not recognised and ignored");
   }
@@ -487,8 +426,6 @@
 
     ItsConfig itsConfig = createItsConfig();
 
-    replayMocks();
-
     assertFalse(itsConfig.getItsProjectName(Project.nameKey("testProject")).isPresent());
   }
 
@@ -498,8 +435,6 @@
 
     ItsConfig itsConfig = createItsConfig();
 
-    replayMocks();
-
     Optional<String> itsProjectName = itsConfig.getItsProjectName(Project.nameKey("testProject"));
     assertTrue(itsProjectName.isPresent());
     assertEquals("itsProject", itsProjectName.get());
@@ -508,328 +443,280 @@
   public void testGetIssuePatternNullMatch() {
     ItsConfig itsConfig = createItsConfig();
 
-    expect(serverConfig.getString("plugin", "ItsTestName", "commentlink"))
-        .andReturn(null)
-        .atLeastOnce();
-    expect(serverConfig.getString("commentlink", "ItsTestName", "match"))
-        .andReturn(null)
-        .atLeastOnce();
-
-    replayMocks();
-
     assertNull("Pattern for null match is not null", itsConfig.getIssuePattern());
+
+    verifyOneOrMore(serverConfig).getString("plugin", "ItsTestName", "commentlink");
+    verifyOneOrMore(serverConfig).getString("commentlink", "ItsTestName", "match");
   }
 
   public void testGetIssuePatternNullMatchWCommentLink() {
     ItsConfig itsConfig = createItsConfig();
 
-    expect(serverConfig.getString("plugin", "ItsTestName", "commentlink"))
-        .andReturn("foo")
-        .atLeastOnce();
-    expect(serverConfig.getString("commentlink", "foo", "match")).andReturn(null).atLeastOnce();
-
-    replayMocks();
+    when(serverConfig.getString("plugin", "ItsTestName", "commentlink")).thenReturn("foo");
 
     assertNull("Pattern for null match is not null", itsConfig.getIssuePattern());
+
+    verifyOneOrMore(serverConfig).getString("plugin", "ItsTestName", "commentlink");
+    verifyOneOrMore(serverConfig).getString("commentlink", "foo", "match");
   }
 
   public void testGetIssuePattern() {
     ItsConfig itsConfig = createItsConfig();
 
-    expect(serverConfig.getString("plugin", "ItsTestName", "commentlink"))
-        .andReturn(null)
-        .atLeastOnce();
-    expect(serverConfig.getString("commentlink", "ItsTestName", "match"))
-        .andReturn("TestPattern")
-        .atLeastOnce();
-
-    replayMocks();
+    when(serverConfig.getString("commentlink", "ItsTestName", "match")).thenReturn("TestPattern");
 
     assertEquals(
         "Expected and generated pattern are not equal",
         "TestPattern",
         itsConfig.getIssuePattern().pattern());
+
+    verifyOneOrMore(serverConfig).getString("plugin", "ItsTestName", "commentlink");
+    verifyOneOrMore(serverConfig).getString("commentlink", "ItsTestName", "match");
   }
 
   public void testGetIssuePatternWCommentLink() {
     ItsConfig itsConfig = createItsConfig();
 
-    expect(serverConfig.getString("plugin", "ItsTestName", "commentlink"))
-        .andReturn("foo")
-        .atLeastOnce();
-    expect(serverConfig.getString("commentlink", "foo", "match"))
-        .andReturn("TestPattern")
-        .atLeastOnce();
-
-    replayMocks();
+    when(serverConfig.getString("plugin", "ItsTestName", "commentlink")).thenReturn("foo");
+    when(serverConfig.getString("commentlink", "foo", "match")).thenReturn("TestPattern");
 
     assertEquals(
         "Expected and generated pattern are not equal",
         "TestPattern",
         itsConfig.getIssuePattern().pattern());
+
+    verifyOneOrMore(serverConfig).getString("plugin", "ItsTestName", "commentlink");
+    verifyOneOrMore(serverConfig).getString("commentlink", "foo", "match");
   }
 
   public void testGetIssuePatternGroupIndexGroupDefault() {
     ItsConfig itsConfig = createItsConfig();
 
-    expect(serverConfig.getString("plugin", "ItsTestName", "commentlink"))
-        .andReturn(null)
-        .atLeastOnce();
-    expect(serverConfig.getString("commentlink", "ItsTestName", "match"))
-        .andReturn("(foo)(bar)(baz)")
-        .atLeastOnce();
-    expect(serverConfig.getInt("plugin", "ItsTestName", "commentlinkGroupIndex", 1))
-        .andReturn(1)
-        .atLeastOnce();
-
-    replayMocks();
+    when(serverConfig.getString("commentlink", "ItsTestName", "match"))
+        .thenReturn("(foo)(bar)(baz)");
+    when(serverConfig.getInt("plugin", "ItsTestName", "commentlinkGroupIndex", 1)).thenReturn(1);
 
     assertEquals(
         "Expected and actual group index do not match", 1, itsConfig.getIssuePatternGroupIndex());
+
+    verifyOneOrMore(serverConfig).getString("plugin", "ItsTestName", "commentlink");
+    verifyOneOrMore(serverConfig).getString("commentlink", "ItsTestName", "match");
+    verifyOneOrMore(serverConfig).getInt("plugin", "ItsTestName", "commentlinkGroupIndex", 1);
   }
 
   public void testGetIssuePatternGroupIndexGroupDefaultGroupless() {
     ItsConfig itsConfig = createItsConfig();
 
-    expect(serverConfig.getString("plugin", "ItsTestName", "commentlink"))
-        .andReturn(null)
-        .atLeastOnce();
-    expect(serverConfig.getString("commentlink", "ItsTestName", "match"))
-        .andReturn("foo")
-        .atLeastOnce();
-    expect(serverConfig.getInt("plugin", "ItsTestName", "commentlinkGroupIndex", 1))
-        .andReturn(1)
-        .atLeastOnce();
-
-    replayMocks();
+    when(serverConfig.getString("commentlink", "ItsTestName", "match")).thenReturn("foo");
+    when(serverConfig.getInt("plugin", "ItsTestName", "commentlinkGroupIndex", 1)).thenReturn(1);
 
     assertEquals(
         "Expected and actual group index do not match", 0, itsConfig.getIssuePatternGroupIndex());
+
+    verifyOneOrMore(serverConfig).getString("plugin", "ItsTestName", "commentlink");
+    verifyOneOrMore(serverConfig).getString("commentlink", "ItsTestName", "match");
+    verifyOneOrMore(serverConfig).getInt("plugin", "ItsTestName", "commentlinkGroupIndex", 1);
   }
 
   public void testGetIssuePatternGroupIndexGroup1() {
     ItsConfig itsConfig = createItsConfig();
 
-    expect(serverConfig.getString("plugin", "ItsTestName", "commentlink"))
-        .andReturn(null)
-        .atLeastOnce();
-    expect(serverConfig.getString("commentlink", "ItsTestName", "match"))
-        .andReturn("(foo)(bar)(baz)")
-        .atLeastOnce();
-    expect(serverConfig.getInt("plugin", "ItsTestName", "commentlinkGroupIndex", 1))
-        .andReturn(1)
-        .atLeastOnce();
-
-    replayMocks();
+    when(serverConfig.getString("commentlink", "ItsTestName", "match"))
+        .thenReturn("(foo)(bar)(baz)");
+    when(serverConfig.getInt("plugin", "ItsTestName", "commentlinkGroupIndex", 1)).thenReturn(1);
 
     assertEquals(
         "Expected and actual group index do not match", 1, itsConfig.getIssuePatternGroupIndex());
+
+    verifyOneOrMore(serverConfig).getString("plugin", "ItsTestName", "commentlink");
+    verifyOneOrMore(serverConfig).getString("commentlink", "ItsTestName", "match");
+    verifyOneOrMore(serverConfig).getInt("plugin", "ItsTestName", "commentlinkGroupIndex", 1);
   }
 
   public void testGetIssuePatternGroupIndexGroup3() {
     ItsConfig itsConfig = createItsConfig();
 
-    expect(serverConfig.getString("plugin", "ItsTestName", "commentlink"))
-        .andReturn(null)
-        .atLeastOnce();
-    expect(serverConfig.getString("commentlink", "ItsTestName", "match"))
-        .andReturn("(foo)(bar)(baz)")
-        .atLeastOnce();
-    expect(serverConfig.getInt("plugin", "ItsTestName", "commentlinkGroupIndex", 1))
-        .andReturn(3)
-        .atLeastOnce();
-
-    replayMocks();
+    when(serverConfig.getString("commentlink", "ItsTestName", "match"))
+        .thenReturn("(foo)(bar)(baz)");
+    when(serverConfig.getInt("plugin", "ItsTestName", "commentlinkGroupIndex", 1)).thenReturn(3);
 
     assertEquals(
         "Expected and actual group index do not match", 3, itsConfig.getIssuePatternGroupIndex());
+
+    verifyOneOrMore(serverConfig).getString("plugin", "ItsTestName", "commentlink");
+    verifyOneOrMore(serverConfig).getString("commentlink", "ItsTestName", "match");
+    verifyOneOrMore(serverConfig).getInt("plugin", "ItsTestName", "commentlinkGroupIndex", 1);
   }
 
   public void testGetIssuePatternGroupIndexGroupTooHigh() {
     ItsConfig itsConfig = createItsConfig();
 
-    expect(serverConfig.getString("plugin", "ItsTestName", "commentlink"))
-        .andReturn(null)
-        .atLeastOnce();
-    expect(serverConfig.getString("commentlink", "ItsTestName", "match"))
-        .andReturn("(foo)(bar)(baz)")
-        .atLeastOnce();
-    expect(serverConfig.getInt("plugin", "ItsTestName", "commentlinkGroupIndex", 1))
-        .andReturn(5)
-        .atLeastOnce();
-
-    replayMocks();
+    when(serverConfig.getString("commentlink", "ItsTestName", "match"))
+        .thenReturn("(foo)(bar)(baz)");
+    when(serverConfig.getInt("plugin", "ItsTestName", "commentlinkGroupIndex", 1)).thenReturn(5);
 
     assertEquals(
         "Expected and actual group index do not match", 1, itsConfig.getIssuePatternGroupIndex());
+
+    verifyOneOrMore(serverConfig).getString("plugin", "ItsTestName", "commentlink");
+    verifyOneOrMore(serverConfig).getString("commentlink", "ItsTestName", "match");
+    verifyOneOrMore(serverConfig).getInt("plugin", "ItsTestName", "commentlinkGroupIndex", 1);
   }
 
   public void testGetIssuePatternGroupIndexGroupTooHighGroupless() {
     ItsConfig itsConfig = createItsConfig();
 
-    expect(serverConfig.getString("plugin", "ItsTestName", "commentlink"))
-        .andReturn(null)
-        .atLeastOnce();
-    expect(serverConfig.getString("commentlink", "ItsTestName", "match"))
-        .andReturn("foo")
-        .atLeastOnce();
-    expect(serverConfig.getInt("plugin", "ItsTestName", "commentlinkGroupIndex", 1))
-        .andReturn(5)
-        .atLeastOnce();
-
-    replayMocks();
+    when(serverConfig.getString("commentlink", "ItsTestName", "match")).thenReturn("foo");
+    when(serverConfig.getInt("plugin", "ItsTestName", "commentlinkGroupIndex", 1)).thenReturn(5);
 
     assertEquals(
         "Expected and actual group index do not match", 0, itsConfig.getIssuePatternGroupIndex());
+
+    verifyOneOrMore(serverConfig).getString("plugin", "ItsTestName", "commentlink");
+    verifyOneOrMore(serverConfig).getString("commentlink", "ItsTestName", "match");
+    verifyOneOrMore(serverConfig).getInt("plugin", "ItsTestName", "commentlinkGroupIndex", 1);
   }
 
   public void testGetItsAssociationPolicyOptional() {
     ItsConfig itsConfig = createItsConfig();
 
-    expect(serverConfig.getString("plugin", "ItsTestName", "commentlink"))
-        .andReturn(null)
-        .atLeastOnce();
-    expect(
-            serverConfig.getEnum(
-                "commentlink", "ItsTestName", "association", ItsAssociationPolicy.OPTIONAL))
-        .andReturn(ItsAssociationPolicy.OPTIONAL)
-        .atLeastOnce();
-    expect(
-            serverConfig.getEnum(
-                "plugin", "ItsTestName", "association", ItsAssociationPolicy.OPTIONAL))
-        .andReturn(ItsAssociationPolicy.OPTIONAL)
-        .atLeastOnce();
-
-    replayMocks();
+    when(serverConfig.getEnum(
+            "commentlink", "ItsTestName", "association", ItsAssociationPolicy.OPTIONAL))
+        .thenReturn(ItsAssociationPolicy.OPTIONAL);
+    when(serverConfig.getEnum(
+            "plugin", "ItsTestName", "association", ItsAssociationPolicy.OPTIONAL))
+        .thenReturn(ItsAssociationPolicy.OPTIONAL);
 
     assertEquals(
         "Expected and generated associated policy do not match",
         ItsAssociationPolicy.OPTIONAL,
         itsConfig.getItsAssociationPolicy());
+
+    verifyOneOrMore(serverConfig).getString("plugin", "ItsTestName", "commentlink");
+    verifyOneOrMore(serverConfig)
+        .getEnum("commentlink", "ItsTestName", "association", ItsAssociationPolicy.OPTIONAL);
+    verifyOneOrMore(serverConfig)
+        .getEnum("plugin", "ItsTestName", "association", ItsAssociationPolicy.OPTIONAL);
   }
 
   public void testGetItsAssociationPolicyOptionalWCommentLink() {
     ItsConfig itsConfig = createItsConfig();
 
-    expect(serverConfig.getString("plugin", "ItsTestName", "commentlink"))
-        .andReturn("foo")
-        .atLeastOnce();
-    expect(serverConfig.getEnum("commentlink", "foo", "association", ItsAssociationPolicy.OPTIONAL))
-        .andReturn(ItsAssociationPolicy.OPTIONAL)
-        .atLeastOnce();
-    expect(
-            serverConfig.getEnum(
-                "plugin", "ItsTestName", "association", ItsAssociationPolicy.OPTIONAL))
-        .andReturn(ItsAssociationPolicy.OPTIONAL)
-        .atLeastOnce();
-
-    replayMocks();
+    when(serverConfig.getString("plugin", "ItsTestName", "commentlink")).thenReturn("foo");
+    when(serverConfig.getEnum("commentlink", "foo", "association", ItsAssociationPolicy.OPTIONAL))
+        .thenReturn(ItsAssociationPolicy.OPTIONAL);
+    when(serverConfig.getEnum(
+            "plugin", "ItsTestName", "association", ItsAssociationPolicy.OPTIONAL))
+        .thenReturn(ItsAssociationPolicy.OPTIONAL);
 
     assertEquals(
         "Expected and generated associated policy do not match",
         ItsAssociationPolicy.OPTIONAL,
         itsConfig.getItsAssociationPolicy());
+
+    verifyOneOrMore(serverConfig).getString("plugin", "ItsTestName", "commentlink");
+    verifyOneOrMore(serverConfig)
+        .getEnum("commentlink", "foo", "association", ItsAssociationPolicy.OPTIONAL);
+    verifyOneOrMore(serverConfig)
+        .getEnum("plugin", "ItsTestName", "association", ItsAssociationPolicy.OPTIONAL);
   }
 
   public void testGetItsAssociationPolicySuggested() {
     ItsConfig itsConfig = createItsConfig();
 
-    expect(serverConfig.getString("plugin", "ItsTestName", "commentlink"))
-        .andReturn(null)
-        .atLeastOnce();
-    expect(
-            serverConfig.getEnum(
-                "commentlink", "ItsTestName", "association", ItsAssociationPolicy.OPTIONAL))
-        .andReturn(ItsAssociationPolicy.SUGGESTED)
-        .atLeastOnce();
-    expect(
-            serverConfig.getEnum(
-                "plugin", "ItsTestName", "association", ItsAssociationPolicy.SUGGESTED))
-        .andReturn(ItsAssociationPolicy.SUGGESTED)
-        .atLeastOnce();
-    replayMocks();
+    when(serverConfig.getEnum(
+            "commentlink", "ItsTestName", "association", ItsAssociationPolicy.OPTIONAL))
+        .thenReturn(ItsAssociationPolicy.SUGGESTED);
+    when(serverConfig.getEnum(
+            "plugin", "ItsTestName", "association", ItsAssociationPolicy.SUGGESTED))
+        .thenReturn(ItsAssociationPolicy.SUGGESTED);
 
     assertEquals(
         "Expected and generated associated policy do not match",
         ItsAssociationPolicy.SUGGESTED,
         itsConfig.getItsAssociationPolicy());
+
+    verifyOneOrMore(serverConfig).getString("plugin", "ItsTestName", "commentlink");
+    verifyOneOrMore(serverConfig)
+        .getEnum("commentlink", "ItsTestName", "association", ItsAssociationPolicy.OPTIONAL);
+    verifyOneOrMore(serverConfig)
+        .getEnum("plugin", "ItsTestName", "association", ItsAssociationPolicy.SUGGESTED);
   }
 
   public void testGetItsAssociationPolicySuggestedWCommentLink() {
     ItsConfig itsConfig = createItsConfig();
 
-    expect(serverConfig.getString("plugin", "ItsTestName", "commentlink"))
-        .andReturn("foo")
-        .atLeastOnce();
-    expect(
-            serverConfig.getEnum(
-                "plugin", "ItsTestName", "association", ItsAssociationPolicy.SUGGESTED))
-        .andReturn(ItsAssociationPolicy.SUGGESTED)
-        .atLeastOnce();
-    expect(serverConfig.getEnum("commentlink", "foo", "association", ItsAssociationPolicy.OPTIONAL))
-        .andReturn(ItsAssociationPolicy.SUGGESTED)
-        .atLeastOnce();
-
-    replayMocks();
+    when(serverConfig.getString("plugin", "ItsTestName", "commentlink")).thenReturn("foo");
+    when(serverConfig.getEnum(
+            "plugin", "ItsTestName", "association", ItsAssociationPolicy.SUGGESTED))
+        .thenReturn(ItsAssociationPolicy.SUGGESTED);
+    when(serverConfig.getEnum("commentlink", "foo", "association", ItsAssociationPolicy.OPTIONAL))
+        .thenReturn(ItsAssociationPolicy.SUGGESTED);
 
     assertEquals(
         "Expected and generated associated policy do not match",
         ItsAssociationPolicy.SUGGESTED,
         itsConfig.getItsAssociationPolicy());
+
+    verifyOneOrMore(serverConfig).getString("plugin", "ItsTestName", "commentlink");
+    verifyOneOrMore(serverConfig)
+        .getEnum("plugin", "ItsTestName", "association", ItsAssociationPolicy.SUGGESTED);
+    verifyOneOrMore(serverConfig)
+        .getEnum("commentlink", "foo", "association", ItsAssociationPolicy.OPTIONAL);
   }
 
   public void testGetItsAssociationPolicyMandatory() {
     ItsConfig itsConfig = createItsConfig();
 
-    expect(serverConfig.getString("plugin", "ItsTestName", "commentlink"))
-        .andReturn(null)
-        .atLeastOnce();
-    expect(
-            serverConfig.getEnum(
-                "commentlink", "ItsTestName", "association", ItsAssociationPolicy.OPTIONAL))
-        .andReturn(ItsAssociationPolicy.MANDATORY)
-        .atLeastOnce();
-    expect(
-            serverConfig.getEnum(
-                "plugin", "ItsTestName", "association", ItsAssociationPolicy.MANDATORY))
-        .andReturn(ItsAssociationPolicy.MANDATORY)
-        .atLeastOnce();
-
-    replayMocks();
+    when(serverConfig.getEnum(
+            "commentlink", "ItsTestName", "association", ItsAssociationPolicy.OPTIONAL))
+        .thenReturn(ItsAssociationPolicy.MANDATORY);
+    when(serverConfig.getEnum(
+            "plugin", "ItsTestName", "association", ItsAssociationPolicy.MANDATORY))
+        .thenReturn(ItsAssociationPolicy.MANDATORY);
 
     assertEquals(
         "Expected and generated associated policy do not match",
         ItsAssociationPolicy.MANDATORY,
         itsConfig.getItsAssociationPolicy());
+
+    verifyOneOrMore(serverConfig).getString("plugin", "ItsTestName", "commentlink");
+    verifyOneOrMore(serverConfig)
+        .getEnum("commentlink", "ItsTestName", "association", ItsAssociationPolicy.OPTIONAL);
+    verifyOneOrMore(serverConfig)
+        .getEnum("plugin", "ItsTestName", "association", ItsAssociationPolicy.MANDATORY);
   }
 
   public void testGetItsAssociationPolicyMandatoryWCommentLink() {
     ItsConfig itsConfig = createItsConfig();
 
-    expect(serverConfig.getString("plugin", "ItsTestName", "commentlink"))
-        .andReturn("foo")
-        .atLeastOnce();
-    expect(serverConfig.getEnum("commentlink", "foo", "association", ItsAssociationPolicy.OPTIONAL))
-        .andReturn(ItsAssociationPolicy.MANDATORY)
-        .atLeastOnce();
-    expect(
-            serverConfig.getEnum(
-                "plugin", "ItsTestName", "association", ItsAssociationPolicy.MANDATORY))
-        .andReturn(ItsAssociationPolicy.MANDATORY)
-        .atLeastOnce();
-
-    replayMocks();
+    when(serverConfig.getString("plugin", "ItsTestName", "commentlink")).thenReturn("foo");
+    when(serverConfig.getEnum("commentlink", "foo", "association", ItsAssociationPolicy.OPTIONAL))
+        .thenReturn(ItsAssociationPolicy.MANDATORY);
+    when(serverConfig.getEnum(
+            "plugin", "ItsTestName", "association", ItsAssociationPolicy.MANDATORY))
+        .thenReturn(ItsAssociationPolicy.MANDATORY);
 
     assertEquals(
         "Expected and generated associated policy do not match",
         ItsAssociationPolicy.MANDATORY,
         itsConfig.getItsAssociationPolicy());
+
+    verifyOneOrMore(serverConfig).getString("plugin", "ItsTestName", "commentlink");
+    verifyOneOrMore(serverConfig)
+        .getEnum("commentlink", "foo", "association", ItsAssociationPolicy.OPTIONAL);
+    verifyOneOrMore(serverConfig)
+        .getEnum("plugin", "ItsTestName", "association", ItsAssociationPolicy.MANDATORY);
   }
 
   private ItsConfig createItsConfig() {
     return injector.getInstance(ItsConfig.class);
   }
 
+  private <T> T verifyOneOrMore(T mock) {
+    return verify(mock, atLeastOnce());
+  }
+
   @Override
   public void setUp() throws Exception {
     super.setUp();
@@ -839,15 +726,15 @@
   private class TestModule extends FactoryModule {
     @Override
     protected void configure() {
-      projectCache = createMock(ProjectCache.class);
+      projectCache = mock(ProjectCache.class);
       bind(ProjectCache.class).toInstance(projectCache);
 
-      pluginConfigFactory = createMock(PluginConfigFactory.class);
+      pluginConfigFactory = mock(PluginConfigFactory.class);
       bind(PluginConfigFactory.class).toInstance(pluginConfigFactory);
 
       bind(String.class).annotatedWith(PluginName.class).toInstance("ItsTestName");
 
-      serverConfig = createMock(Config.class);
+      serverConfig = mock(Config.class);
       bind(Config.class).annotatedWith(GerritServerConfig.class).toInstance(serverConfig);
     }
   }
diff --git a/src/test/java/com/googlesource/gerrit/plugins/its/base/testutil/LoggingMockingTestCase.java b/src/test/java/com/googlesource/gerrit/plugins/its/base/testutil/LoggingMockingTestCase.java
index 8256873..03dda08 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/its/base/testutil/LoggingMockingTestCase.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/its/base/testutil/LoggingMockingTestCase.java
@@ -22,11 +22,12 @@
 import com.googlesource.gerrit.plugins.its.base.testutil.log.LogUtil;
 import java.sql.Timestamp;
 import java.util.Iterator;
+import junit.framework.TestCase;
 import org.apache.log4j.Level;
 import org.apache.log4j.spi.LoggingEvent;
 import org.junit.After;
 
-public abstract class LoggingMockingTestCase extends MockingTestCase {
+public abstract class LoggingMockingTestCase extends TestCase {
 
   protected final Change.Key testChangeKey =
       Change.key("Ic19f7bf6c8b4685c363a8204c32d827ffda52ec0");
diff --git a/src/test/java/com/googlesource/gerrit/plugins/its/base/testutil/MockingTestCase.java b/src/test/java/com/googlesource/gerrit/plugins/its/base/testutil/MockingTestCase.java
deleted file mode 100644
index d717024..0000000
--- a/src/test/java/com/googlesource/gerrit/plugins/its/base/testutil/MockingTestCase.java
+++ /dev/null
@@ -1,157 +0,0 @@
-// Copyright (C) 2013 The Android Open Source Project
-//
-// 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 com.googlesource.gerrit.plugins.its.base.testutil;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import junit.framework.TestCase;
-import org.easymock.Capture;
-import org.easymock.EasyMock;
-import org.easymock.IMocksControl;
-import org.junit.After;
-import org.junit.runner.RunWith;
-import org.powermock.api.easymock.PowerMock;
-import org.powermock.modules.junit4.PowerMockRunner;
-
-/** Test case with some support for automatically verifying mocks. */
-public abstract class MockingTestCase extends TestCase {
-  private Collection<Object> mocks;
-  private Collection<IMocksControl> mockControls;
-  private boolean mocksReplayed;
-  private boolean usePowerMock;
-
-  /**
-   * Create and register a mock control.
-   *
-   * @return The mock control instance.
-   */
-  protected final IMocksControl createMockControl() {
-    IMocksControl mockControl = EasyMock.createControl();
-    assertTrue("Adding mock control failed", mockControls.add(mockControl));
-    return mockControl;
-  }
-
-  /**
-   * Create and register a mock.
-   *
-   * <p>Creates a mock and registers it in the list of created mocks, so it gets treated
-   * automatically upon {@code replay} and {@code verify};
-   *
-   * @param toMock The class to create a mock for.
-   * @return The mock instance.
-   */
-  protected final <T> T createMock(Class<T> toMock) {
-    return createMock(toMock, null);
-  }
-
-  /**
-   * Create a mock for a mock control and register a mock.
-   *
-   * <p>Creates a mock and registers it in the list of created mocks, so it gets treated
-   * automatically upon {@code replay} and {@code verify};
-   *
-   * @param toMock The class to create a mock for.
-   * @param control The mock control to create the mock on. If null, do not use a specific control.
-   * @return The mock instance.
-   */
-  protected final <T> T createMock(Class<T> toMock, IMocksControl control) {
-    assertFalse("Mocks have already been set to replay", mocksReplayed);
-    final T mock;
-    if (control == null) {
-      if (usePowerMock) {
-        mock = PowerMock.createMock(toMock);
-      } else {
-        mock = EasyMock.createMock(toMock);
-      }
-      assertTrue("Adding " + toMock.getName() + " mock failed", mocks.add(mock));
-    } else {
-      mock = control.createMock(toMock);
-    }
-    return mock;
-  }
-
-  /** Set all registered mocks to replay */
-  protected final void replayMocks() {
-    assertFalse("Mocks have already been set to replay", mocksReplayed);
-    if (usePowerMock) {
-      PowerMock.replayAll();
-    } else {
-      EasyMock.replay(mocks.toArray());
-    }
-    for (IMocksControl mockControl : mockControls) {
-      mockControl.replay();
-    }
-    mocksReplayed = true;
-  }
-
-  /**
-   * Verify all registered mocks
-   *
-   * <p>This method is called automatically at the end of a test. Nevertheless, it is safe to also
-   * call it beforehand, if this better meets the verification part of a test.
-   */
-  // As the PowerMock runner does not pass through runTest, we inject mock
-  // verification through @After
-  @After
-  public final void verifyMocks() {
-    if (!mocks.isEmpty() || !mockControls.isEmpty()) {
-      assertTrue(
-          "Created mocks have not been set to replay. Call replayMocks " + "within the test",
-          mocksReplayed);
-      if (usePowerMock) {
-        PowerMock.verifyAll();
-      } else {
-        EasyMock.verify(mocks.toArray());
-      }
-      for (IMocksControl mockControl : mockControls) {
-        mockControl.verify();
-      }
-    }
-  }
-
-  @Override
-  public void setUp() throws Exception {
-    super.setUp();
-
-    usePowerMock = false;
-    RunWith runWith = this.getClass().getAnnotation(RunWith.class);
-    if (runWith != null) {
-      usePowerMock = PowerMockRunner.class.isAssignableFrom(runWith.value());
-    }
-
-    mocks = new ArrayList<>();
-    mockControls = new ArrayList<>();
-    mocksReplayed = false;
-  }
-
-  @Override
-  protected void runTest() throws Throwable {
-    super.runTest();
-    // Plain JUnit runner does not pick up @After, so we add it here
-    // explicitly. Note, that we cannot put this into tearDown, as failure
-    // to verify mocks would bail out and might leave open resources from
-    // subclasses open.
-    verifyMocks();
-  }
-
-  /**
-   * Create a new Capture.
-   *
-   * @return The created Capture.
-   */
-  protected final <T> Capture<T> createCapture() {
-    return new Capture<>();
-  }
-}
diff --git a/src/test/java/com/googlesource/gerrit/plugins/its/base/util/IssueExtractorTest.java b/src/test/java/com/googlesource/gerrit/plugins/its/base/util/IssueExtractorTest.java
index ff5d165..a288f03 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/its/base/util/IssueExtractorTest.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/its/base/util/IssueExtractorTest.java
@@ -13,7 +13,10 @@
 // limitations under the License.
 package com.googlesource.gerrit.plugins.its.base.util;
 
-import static org.easymock.EasyMock.expect;
+import static org.mockito.Mockito.atLeastOnce;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
 
 import com.google.common.collect.Maps;
 import com.google.common.collect.Sets;
@@ -30,12 +33,7 @@
 import java.util.Map;
 import java.util.Set;
 import java.util.regex.Pattern;
-import org.junit.runner.RunWith;
-import org.powermock.core.classloader.annotations.PrepareForTest;
-import org.powermock.modules.junit4.PowerMockRunner;
 
-@RunWith(PowerMockRunner.class)
-@PrepareForTest({PatchSet.class})
 public class IssueExtractorTest extends LoggingMockingTestCase {
   private Injector injector;
   private ItsConfig itsConfig;
@@ -45,124 +43,127 @@
   public void testIssueIdsNullPattern() {
     IssueExtractor issueExtractor = injector.getInstance(IssueExtractor.class);
 
-    expect(itsConfig.getIssuePattern()).andReturn(null).atLeastOnce();
-
-    replayMocks();
-
     String[] ret = issueExtractor.getIssueIds("Test");
     assertEquals("Number of found ids do not match", 0, ret.length);
+
+    verifyOneOrMore(itsConfig).getIssuePattern();
   }
 
   public void testIssueIdsNoMatch() {
     IssueExtractor issueExtractor = injector.getInstance(IssueExtractor.class);
 
-    expect(itsConfig.getIssuePattern()).andReturn(Pattern.compile("bug#(\\d+)")).atLeastOnce();
-    expect(itsConfig.getIssuePatternGroupIndex()).andReturn(1).atLeastOnce();
-
-    replayMocks();
+    when(itsConfig.getIssuePattern()).thenReturn(Pattern.compile("bug#(\\d+)"));
+    when(itsConfig.getIssuePatternGroupIndex()).thenReturn(1);
 
     String[] ret = issueExtractor.getIssueIds("Test");
     assertEquals("Number of found ids do not match", 0, ret.length);
 
     assertLogMessageContains("Matching");
+
+    verifyOneOrMore(itsConfig).getIssuePattern();
+    verifyOneOrMore(itsConfig).getIssuePatternGroupIndex();
   }
 
   public void testIssueIdsEmptyGroup() {
     IssueExtractor issueExtractor = injector.getInstance(IssueExtractor.class);
 
-    expect(itsConfig.getIssuePattern()).andReturn(Pattern.compile("bug#(X*)(\\d+)")).atLeastOnce();
-    expect(itsConfig.getIssuePatternGroupIndex()).andReturn(1).atLeastOnce();
-
-    replayMocks();
+    when(itsConfig.getIssuePattern()).thenReturn(Pattern.compile("bug#(X*)(\\d+)"));
+    when(itsConfig.getIssuePatternGroupIndex()).thenReturn(1);
 
     String[] ret = issueExtractor.getIssueIds("bug#4711");
     assertEquals("Number of found ids do not match", 0, ret.length);
 
     assertLogMessageContains("Matching");
+
+    verifyOneOrMore(itsConfig).getIssuePattern();
+    verifyOneOrMore(itsConfig).getIssuePatternGroupIndex();
   }
 
   public void testIssueIdsFullMatch() {
     IssueExtractor issueExtractor = injector.getInstance(IssueExtractor.class);
 
-    expect(itsConfig.getIssuePattern()).andReturn(Pattern.compile("bug#(\\d+)")).atLeastOnce();
-    expect(itsConfig.getIssuePatternGroupIndex()).andReturn(1).atLeastOnce();
-
-    replayMocks();
+    when(itsConfig.getIssuePattern()).thenReturn(Pattern.compile("bug#(\\d+)"));
+    when(itsConfig.getIssuePatternGroupIndex()).thenReturn(1);
 
     String[] ret = issueExtractor.getIssueIds("bug#4711");
     assertEquals("Number of found ids do not match", 1, ret.length);
     assertEquals("First found issue id do not match", "4711", ret[0]);
 
     assertLogMessageContains("Matching");
+
+    verifyOneOrMore(itsConfig).getIssuePattern();
+    verifyOneOrMore(itsConfig).getIssuePatternGroupIndex();
   }
 
   public void testIssueIdsMatch() {
     IssueExtractor issueExtractor = injector.getInstance(IssueExtractor.class);
 
-    expect(itsConfig.getIssuePattern()).andReturn(Pattern.compile("bug#(\\d+)")).atLeastOnce();
-    expect(itsConfig.getIssuePatternGroupIndex()).andReturn(1).atLeastOnce();
-
-    replayMocks();
+    when(itsConfig.getIssuePattern()).thenReturn(Pattern.compile("bug#(\\d+)"));
+    when(itsConfig.getIssuePatternGroupIndex()).thenReturn(1);
 
     String[] ret = issueExtractor.getIssueIds("Foo bug#4711 bar");
     assertEquals("Number of found ids do not match", 1, ret.length);
     assertEquals("Found issue id does not match", "4711", ret[0]);
 
     assertLogMessageContains("Matching");
+
+    verifyOneOrMore(itsConfig).getIssuePattern();
+    verifyOneOrMore(itsConfig).getIssuePatternGroupIndex();
   }
 
   public void testIssueIdsGrouplessMatch() {
     IssueExtractor issueExtractor = injector.getInstance(IssueExtractor.class);
 
-    expect(itsConfig.getIssuePattern()).andReturn(Pattern.compile("bug#\\d+")).atLeastOnce();
-    expect(itsConfig.getIssuePatternGroupIndex()).andReturn(0).atLeastOnce();
-
-    replayMocks();
+    when(itsConfig.getIssuePattern()).thenReturn(Pattern.compile("bug#\\d+"));
+    when(itsConfig.getIssuePatternGroupIndex()).thenReturn(0);
 
     String[] ret = issueExtractor.getIssueIds("Foo bug#4711 bar");
     assertEquals("Number of found ids do not match", 1, ret.length);
     assertEquals("Found issue id does not match", "bug#4711", ret[0]);
 
     assertLogMessageContains("Matching");
+
+    verifyOneOrMore(itsConfig).getIssuePattern();
+    verifyOneOrMore(itsConfig).getIssuePatternGroupIndex();
   }
 
   public void testIssueIdsMultiGroupMatchGroup1() {
     IssueExtractor issueExtractor = injector.getInstance(IssueExtractor.class);
 
-    expect(itsConfig.getIssuePattern()).andReturn(Pattern.compile("bug#(\\d)(\\d+)")).atLeastOnce();
-    expect(itsConfig.getIssuePatternGroupIndex()).andReturn(1).atLeastOnce();
-
-    replayMocks();
+    when(itsConfig.getIssuePattern()).thenReturn(Pattern.compile("bug#(\\d)(\\d+)"));
+    when(itsConfig.getIssuePatternGroupIndex()).thenReturn(1);
 
     String[] ret = issueExtractor.getIssueIds("Foo bug#4711 bar");
     assertEquals("Number of found ids do not match", 1, ret.length);
     assertEquals("Found issue id does not match", "4", ret[0]);
 
     assertLogMessageContains("Matching");
+
+    verifyOneOrMore(itsConfig).getIssuePattern();
+    verifyOneOrMore(itsConfig).getIssuePatternGroupIndex();
   }
 
   public void testIssueIdsMultiGroupMatchGroup2() {
     IssueExtractor issueExtractor = injector.getInstance(IssueExtractor.class);
 
-    expect(itsConfig.getIssuePattern()).andReturn(Pattern.compile("bug#(\\d)(\\d+)")).atLeastOnce();
-    expect(itsConfig.getIssuePatternGroupIndex()).andReturn(2).atLeastOnce();
-
-    replayMocks();
+    when(itsConfig.getIssuePattern()).thenReturn(Pattern.compile("bug#(\\d)(\\d+)"));
+    when(itsConfig.getIssuePatternGroupIndex()).thenReturn(2);
 
     String[] ret = issueExtractor.getIssueIds("Foo bug#4711 bar");
     assertEquals("Number of found ids do not match", 1, ret.length);
     assertEquals("Found issue id does not match", "711", ret[0]);
 
     assertLogMessageContains("Matching");
+
+    verifyOneOrMore(itsConfig).getIssuePattern();
+    verifyOneOrMore(itsConfig).getIssuePatternGroupIndex();
   }
 
   public void testIssueIdsMulipleMatches() {
     IssueExtractor issueExtractor = injector.getInstance(IssueExtractor.class);
 
-    expect(itsConfig.getIssuePattern()).andReturn(Pattern.compile("bug#(\\d+)")).atLeastOnce();
-    expect(itsConfig.getIssuePatternGroupIndex()).andReturn(1).atLeastOnce();
-
-    replayMocks();
+    when(itsConfig.getIssuePattern()).thenReturn(Pattern.compile("bug#(\\d+)"));
+    when(itsConfig.getIssuePatternGroupIndex()).thenReturn(1);
 
     String[] ret = issueExtractor.getIssueIds("Foo bug#4711 bug#42 bar bug#123");
     assertEquals("Number of found ids do not match", 3, ret.length);
@@ -172,15 +173,16 @@
     assertTrue("123 not among the extracted ids", retList.contains("123"));
 
     assertLogMessageContains("Matching");
+
+    verifyOneOrMore(itsConfig).getIssuePattern();
+    verifyOneOrMore(itsConfig).getIssuePatternGroupIndex();
   }
 
   public void testIssueIdsMulipleMatchesWithDuplicates() {
     IssueExtractor issueExtractor = injector.getInstance(IssueExtractor.class);
 
-    expect(itsConfig.getIssuePattern()).andReturn(Pattern.compile("bug#(\\d+)")).atLeastOnce();
-    expect(itsConfig.getIssuePatternGroupIndex()).andReturn(1).atLeastOnce();
-
-    replayMocks();
+    when(itsConfig.getIssuePattern()).thenReturn(Pattern.compile("bug#(\\d+)"));
+    when(itsConfig.getIssuePatternGroupIndex()).thenReturn(1);
 
     String[] ret = issueExtractor.getIssueIds("Foo bug#4711 bug#42 bar\n" + "bug#123 baz bug#42");
     assertEquals("Number of found ids do not match", 3, ret.length);
@@ -190,18 +192,18 @@
     assertTrue("123 not among the extracted ids", retList.contains("123"));
 
     assertLogMessageContains("Matching");
+
+    verifyOneOrMore(itsConfig).getIssuePattern();
+    verifyOneOrMore(itsConfig).getIssuePatternGroupIndex();
   }
 
   public void testIssueIdsCommitSingleIssue() {
-    expect(itsConfig.getIssuePattern()).andReturn(Pattern.compile("bug#(\\d+)")).atLeastOnce();
-    expect(itsConfig.getIssuePatternGroupIndex()).andReturn(1).atLeastOnce();
+    when(itsConfig.getIssuePattern()).thenReturn(Pattern.compile("bug#(\\d+)"));
+    when(itsConfig.getIssuePatternGroupIndex()).thenReturn(1);
 
-    expect(
-            commitMessageFetcher.fetchGuarded(
-                "testProject", "1234567891123456789212345678931234567894"))
-        .andReturn("bug#42\n" + "\n" + "Change-Id: I1234567891123456789212345678931234567894");
-
-    replayMocks();
+    when(commitMessageFetcher.fetchGuarded(
+            "testProject", "1234567891123456789212345678931234567894"))
+        .thenReturn("bug#42\n" + "\n" + "Change-Id: I1234567891123456789212345678931234567894");
 
     IssueExtractor issueExtractor = injector.getInstance(IssueExtractor.class);
     Map<String, Set<String>> actual =
@@ -216,22 +218,22 @@
     assertLogMessageContains("Matching");
     assertLogMessageContains("Matching");
     assertLogMessageContains("Matching");
+
+    verifyOneOrMore(itsConfig).getIssuePattern();
+    verifyOneOrMore(itsConfig).getIssuePatternGroupIndex();
   }
 
   public void testIssueIdsCommitMultipleIssues() {
-    expect(itsConfig.getIssuePattern()).andReturn(Pattern.compile("bug#(\\d+)")).atLeastOnce();
-    expect(itsConfig.getIssuePatternGroupIndex()).andReturn(1).atLeastOnce();
+    when(itsConfig.getIssuePattern()).thenReturn(Pattern.compile("bug#(\\d+)"));
+    when(itsConfig.getIssuePatternGroupIndex()).thenReturn(1);
 
-    expect(
-            commitMessageFetcher.fetchGuarded(
-                "testProject", "1234567891123456789212345678931234567894"))
-        .andReturn(
+    when(commitMessageFetcher.fetchGuarded(
+            "testProject", "1234567891123456789212345678931234567894"))
+        .thenReturn(
             "bug#42, and bug#4711\n"
                 + "\n"
                 + "Change-Id: I1234567891123456789212345678931234567894");
 
-    replayMocks();
-
     IssueExtractor issueExtractor = injector.getInstance(IssueExtractor.class);
     Map<String, Set<String>> actual =
         issueExtractor.getIssueIds("testProject", "1234567891123456789212345678931234567894");
@@ -246,22 +248,22 @@
     assertLogMessageContains("Matching");
     assertLogMessageContains("Matching");
     assertLogMessageContains("Matching");
+
+    verifyOneOrMore(itsConfig).getIssuePattern();
+    verifyOneOrMore(itsConfig).getIssuePatternGroupIndex();
   }
 
   public void testIssueIdsCommitMultipleIssuesMultipleTimes() {
-    expect(itsConfig.getIssuePattern()).andReturn(Pattern.compile("bug#(\\d+)")).atLeastOnce();
-    expect(itsConfig.getIssuePatternGroupIndex()).andReturn(1).atLeastOnce();
+    when(itsConfig.getIssuePattern()).thenReturn(Pattern.compile("bug#(\\d+)"));
+    when(itsConfig.getIssuePatternGroupIndex()).thenReturn(1);
 
-    expect(
-            commitMessageFetcher.fetchGuarded(
-                "testProject", "1234567891123456789212345678931234567894"))
-        .andReturn(
+    when(commitMessageFetcher.fetchGuarded(
+            "testProject", "1234567891123456789212345678931234567894"))
+        .thenReturn(
             "bug#42, bug#4711, bug#4711, bug#42, and bug#4711\n"
                 + "\n"
                 + "Change-Id: I1234567891123456789212345678931234567894");
 
-    replayMocks();
-
     IssueExtractor issueExtractor = injector.getInstance(IssueExtractor.class);
     Map<String, Set<String>> actual =
         issueExtractor.getIssueIds("testProject", "1234567891123456789212345678931234567894");
@@ -276,24 +278,24 @@
     assertLogMessageContains("Matching");
     assertLogMessageContains("Matching");
     assertLogMessageContains("Matching");
+
+    verifyOneOrMore(itsConfig).getIssuePattern();
+    verifyOneOrMore(itsConfig).getIssuePatternGroupIndex();
   }
 
   public void testIssueIdsCommitSingleIssueBody() {
-    expect(itsConfig.getIssuePattern()).andReturn(Pattern.compile("bug#(\\d+)")).atLeastOnce();
-    expect(itsConfig.getIssuePatternGroupIndex()).andReturn(1).atLeastOnce();
+    when(itsConfig.getIssuePattern()).thenReturn(Pattern.compile("bug#(\\d+)"));
+    when(itsConfig.getIssuePatternGroupIndex()).thenReturn(1);
 
-    expect(
-            commitMessageFetcher.fetchGuarded(
-                "testProject", "1234567891123456789212345678931234567894"))
-        .andReturn(
+    when(commitMessageFetcher.fetchGuarded(
+            "testProject", "1234567891123456789212345678931234567894"))
+        .thenReturn(
             "Subject does not reference a bug\n"
                 + "Body references bug#42\n"
                 + "\n"
                 + "Footer: does not reference a bug\n"
                 + "Change-Id: I1234567891123456789212345678931234567894");
 
-    replayMocks();
-
     IssueExtractor issueExtractor = injector.getInstance(IssueExtractor.class);
     Map<String, Set<String>> actual =
         issueExtractor.getIssueIds("testProject", "1234567891123456789212345678931234567894");
@@ -308,24 +310,24 @@
     assertLogMessageContains("Matching");
     assertLogMessageContains("Matching");
     assertLogMessageContains("Matching");
+
+    verifyOneOrMore(itsConfig).getIssuePattern();
+    verifyOneOrMore(itsConfig).getIssuePatternGroupIndex();
   }
 
   public void testIssueIdsCommitSingleIssueFooter() {
-    expect(itsConfig.getIssuePattern()).andReturn(Pattern.compile("bug#(\\d+)")).atLeastOnce();
-    expect(itsConfig.getIssuePatternGroupIndex()).andReturn(1).atLeastOnce();
+    when(itsConfig.getIssuePattern()).thenReturn(Pattern.compile("bug#(\\d+)"));
+    when(itsConfig.getIssuePatternGroupIndex()).thenReturn(1);
 
-    expect(
-            commitMessageFetcher.fetchGuarded(
-                "testProject", "1234567891123456789212345678931234567894"))
-        .andReturn(
+    when(commitMessageFetcher.fetchGuarded(
+            "testProject", "1234567891123456789212345678931234567894"))
+        .thenReturn(
             "Subject does not reference a bug\n"
                 + "Body does not reference a bug\n"
                 + "\n"
                 + "Footer: references bug#42\n"
                 + "Change-Id: I1234567891123456789212345678931234567894");
 
-    replayMocks();
-
     IssueExtractor issueExtractor = injector.getInstance(IssueExtractor.class);
     Map<String, Set<String>> actual =
         issueExtractor.getIssueIds("testProject", "1234567891123456789212345678931234567894");
@@ -340,16 +342,18 @@
     assertLogMessageContains("Matching");
     assertLogMessageContains("Matching");
     assertLogMessageContains("Matching");
+
+    verifyOneOrMore(itsConfig).getIssuePattern();
+    verifyOneOrMore(itsConfig).getIssuePatternGroupIndex();
   }
 
   public void testIssueIdsCommitMultipleIssuesFooter() {
-    expect(itsConfig.getIssuePattern()).andReturn(Pattern.compile("bug#(\\d+)")).atLeastOnce();
-    expect(itsConfig.getIssuePatternGroupIndex()).andReturn(1).atLeastOnce();
+    when(itsConfig.getIssuePattern()).thenReturn(Pattern.compile("bug#(\\d+)"));
+    when(itsConfig.getIssuePatternGroupIndex()).thenReturn(1);
 
-    expect(
-            commitMessageFetcher.fetchGuarded(
-                "testProject", "1234567891123456789212345678931234567894"))
-        .andReturn(
+    when(commitMessageFetcher.fetchGuarded(
+            "testProject", "1234567891123456789212345678931234567894"))
+        .thenReturn(
             "Subject does not reference a bug\n"
                 + "Body does not reference a bug\n"
                 + "\n"
@@ -360,8 +364,6 @@
                 + "Change-Id: I1234567891123456789212345678931234567894\n"
                 + "KeyZ: references bug#256");
 
-    replayMocks();
-
     IssueExtractor issueExtractor = injector.getInstance(IssueExtractor.class);
     Map<String, Set<String>> actual =
         issueExtractor.getIssueIds("testProject", "1234567891123456789212345678931234567894");
@@ -382,16 +384,18 @@
     assertLogMessageContains("Matching");
     assertLogMessageContains("Matching");
     assertLogMessageContains("Matching");
+
+    verifyOneOrMore(itsConfig).getIssuePattern();
+    verifyOneOrMore(itsConfig).getIssuePatternGroupIndex();
   }
 
   public void testIssueIdsCommitDifferentParts() {
-    expect(itsConfig.getIssuePattern()).andReturn(Pattern.compile("bug#(\\d+)")).atLeastOnce();
-    expect(itsConfig.getIssuePatternGroupIndex()).andReturn(1).atLeastOnce();
+    when(itsConfig.getIssuePattern()).thenReturn(Pattern.compile("bug#(\\d+)"));
+    when(itsConfig.getIssuePatternGroupIndex()).thenReturn(1);
 
-    expect(
-            commitMessageFetcher.fetchGuarded(
-                "testProject", "1234567891123456789212345678931234567894"))
-        .andReturn(
+    when(commitMessageFetcher.fetchGuarded(
+            "testProject", "1234567891123456789212345678931234567894"))
+        .thenReturn(
             "Subject references bug#42.\n"
                 + "Body references bug#16.\n"
                 + "Body also references bug#176.\n"
@@ -399,8 +403,6 @@
                 + "Bug: bug#4711 in footer\n"
                 + "Change-Id: I1234567891123456789212345678931234567894");
 
-    replayMocks();
-
     IssueExtractor issueExtractor = injector.getInstance(IssueExtractor.class);
     Map<String, Set<String>> actual =
         issueExtractor.getIssueIds("testProject", "1234567891123456789212345678931234567894");
@@ -418,16 +420,18 @@
     assertLogMessageContains("Matching");
     assertLogMessageContains("Matching");
     assertLogMessageContains("Matching");
+
+    verifyOneOrMore(itsConfig).getIssuePattern();
+    verifyOneOrMore(itsConfig).getIssuePatternGroupIndex();
   }
 
   public void testIssueIdsCommitDifferentPartsEmptySubject() {
-    expect(itsConfig.getIssuePattern()).andReturn(Pattern.compile("bug#(\\d+)")).atLeastOnce();
-    expect(itsConfig.getIssuePatternGroupIndex()).andReturn(1).atLeastOnce();
+    when(itsConfig.getIssuePattern()).thenReturn(Pattern.compile("bug#(\\d+)"));
+    when(itsConfig.getIssuePatternGroupIndex()).thenReturn(1);
 
-    expect(
-            commitMessageFetcher.fetchGuarded(
-                "testProject", "1234567891123456789212345678931234567894"))
-        .andReturn(
+    when(commitMessageFetcher.fetchGuarded(
+            "testProject", "1234567891123456789212345678931234567894"))
+        .thenReturn(
             "\n"
                 + "Body references bug#16.\n"
                 + "Body also references bug#176.\n"
@@ -435,8 +439,6 @@
                 + "Bug: bug#4711 in footer\n"
                 + "Change-Id: I1234567891123456789212345678931234567894");
 
-    replayMocks();
-
     IssueExtractor issueExtractor = injector.getInstance(IssueExtractor.class);
     Map<String, Set<String>> actual =
         issueExtractor.getIssueIds("testProject", "1234567891123456789212345678931234567894");
@@ -453,16 +455,18 @@
     assertLogMessageContains("Matching");
     assertLogMessageContains("Matching");
     assertLogMessageContains("Matching");
+
+    verifyOneOrMore(itsConfig).getIssuePattern();
+    verifyOneOrMore(itsConfig).getIssuePatternGroupIndex();
   }
 
   public void testIssueIdsCommitDifferentPartsLinePastFooter() {
-    expect(itsConfig.getIssuePattern()).andReturn(Pattern.compile("bug#(\\d+)")).atLeastOnce();
-    expect(itsConfig.getIssuePatternGroupIndex()).andReturn(1).atLeastOnce();
+    when(itsConfig.getIssuePattern()).thenReturn(Pattern.compile("bug#(\\d+)"));
+    when(itsConfig.getIssuePatternGroupIndex()).thenReturn(1);
 
-    expect(
-            commitMessageFetcher.fetchGuarded(
-                "testProject", "1234567891123456789212345678931234567894"))
-        .andReturn(
+    when(commitMessageFetcher.fetchGuarded(
+            "testProject", "1234567891123456789212345678931234567894"))
+        .thenReturn(
             "Subject references bug#42.\n"
                 + "Body references bug#16.\n"
                 + "Body also references bug#176.\n"
@@ -470,8 +474,6 @@
                 + "Bug: bug#4711 in footer\n"
                 + "Change-Id: I1234567891123456789212345678931234567894\n");
 
-    replayMocks();
-
     IssueExtractor issueExtractor = injector.getInstance(IssueExtractor.class);
     Map<String, Set<String>> actual =
         issueExtractor.getIssueIds("testProject", "1234567891123456789212345678931234567894");
@@ -489,16 +491,18 @@
     assertLogMessageContains("Matching");
     assertLogMessageContains("Matching");
     assertLogMessageContains("Matching");
+
+    verifyOneOrMore(itsConfig).getIssuePattern();
+    verifyOneOrMore(itsConfig).getIssuePatternGroupIndex();
   }
 
   public void testIssueIdsCommitDifferentPartsLinesPastFooter() {
-    expect(itsConfig.getIssuePattern()).andReturn(Pattern.compile("bug#(\\d+)")).atLeastOnce();
-    expect(itsConfig.getIssuePatternGroupIndex()).andReturn(1).atLeastOnce();
+    when(itsConfig.getIssuePattern()).thenReturn(Pattern.compile("bug#(\\d+)"));
+    when(itsConfig.getIssuePatternGroupIndex()).thenReturn(1);
 
-    expect(
-            commitMessageFetcher.fetchGuarded(
-                "testProject", "1234567891123456789212345678931234567894"))
-        .andReturn(
+    when(commitMessageFetcher.fetchGuarded(
+            "testProject", "1234567891123456789212345678931234567894"))
+        .thenReturn(
             "Subject references bug#42.\n"
                 + "Body references bug#16.\n"
                 + "Body also references bug#176.\n"
@@ -507,8 +511,6 @@
                 + "Change-Id: I1234567891123456789212345678931234567894\n"
                 + "\n");
 
-    replayMocks();
-
     IssueExtractor issueExtractor = injector.getInstance(IssueExtractor.class);
     Map<String, Set<String>> actual =
         issueExtractor.getIssueIds("testProject", "1234567891123456789212345678931234567894");
@@ -526,22 +528,22 @@
     assertLogMessageContains("Matching");
     assertLogMessageContains("Matching");
     assertLogMessageContains("Matching");
+
+    verifyOneOrMore(itsConfig).getIssuePattern();
+    verifyOneOrMore(itsConfig).getIssuePatternGroupIndex();
   }
 
   public void testIssueIdsCommitDifferentPartsNoFooter() {
-    expect(itsConfig.getIssuePattern()).andReturn(Pattern.compile("bug#(\\d+)")).atLeastOnce();
-    expect(itsConfig.getIssuePatternGroupIndex()).andReturn(1).atLeastOnce();
+    when(itsConfig.getIssuePattern()).thenReturn(Pattern.compile("bug#(\\d+)"));
+    when(itsConfig.getIssuePatternGroupIndex()).thenReturn(1);
 
-    expect(
-            commitMessageFetcher.fetchGuarded(
-                "testProject", "1234567891123456789212345678931234567894"))
-        .andReturn(
+    when(commitMessageFetcher.fetchGuarded(
+            "testProject", "1234567891123456789212345678931234567894"))
+        .thenReturn(
             "Subject references bug#42.\n"
                 + "Body references bug#16.\n"
                 + "Body also references bug#176.");
 
-    replayMocks();
-
     IssueExtractor issueExtractor = injector.getInstance(IssueExtractor.class);
     Map<String, Set<String>> actual =
         issueExtractor.getIssueIds("testProject", "1234567891123456789212345678931234567894");
@@ -555,22 +557,22 @@
     assertLogMessageContains("Matching");
     assertLogMessageContains("Matching");
     assertLogMessageContains("Matching");
+
+    verifyOneOrMore(itsConfig).getIssuePattern();
+    verifyOneOrMore(itsConfig).getIssuePatternGroupIndex();
   }
 
   public void testIssueIdsCommitDifferentPartsNoFooterTrailingLine() {
-    expect(itsConfig.getIssuePattern()).andReturn(Pattern.compile("bug#(\\d+)")).atLeastOnce();
-    expect(itsConfig.getIssuePatternGroupIndex()).andReturn(1).atLeastOnce();
+    when(itsConfig.getIssuePattern()).thenReturn(Pattern.compile("bug#(\\d+)"));
+    when(itsConfig.getIssuePatternGroupIndex()).thenReturn(1);
 
-    expect(
-            commitMessageFetcher.fetchGuarded(
-                "testProject", "1234567891123456789212345678931234567894"))
-        .andReturn(
+    when(commitMessageFetcher.fetchGuarded(
+            "testProject", "1234567891123456789212345678931234567894"))
+        .thenReturn(
             "Subject references bug#42.\n"
                 + "Body references bug#16.\n"
                 + "Body also references bug#176.\n");
 
-    replayMocks();
-
     IssueExtractor issueExtractor = injector.getInstance(IssueExtractor.class);
     Map<String, Set<String>> actual =
         issueExtractor.getIssueIds("testProject", "1234567891123456789212345678931234567894");
@@ -584,23 +586,23 @@
     assertLogMessageContains("Matching");
     assertLogMessageContains("Matching");
     assertLogMessageContains("Matching");
+
+    verifyOneOrMore(itsConfig).getIssuePattern();
+    verifyOneOrMore(itsConfig).getIssuePatternGroupIndex();
   }
 
   public void testIssueIdsCommitDifferentPartsNoFooterTrailingLines() {
-    expect(itsConfig.getIssuePattern()).andReturn(Pattern.compile("bug#(\\d+)")).atLeastOnce();
-    expect(itsConfig.getIssuePatternGroupIndex()).andReturn(1).atLeastOnce();
+    when(itsConfig.getIssuePattern()).thenReturn(Pattern.compile("bug#(\\d+)"));
+    when(itsConfig.getIssuePatternGroupIndex()).thenReturn(1);
 
-    expect(
-            commitMessageFetcher.fetchGuarded(
-                "testProject", "1234567891123456789212345678931234567894"))
-        .andReturn(
+    when(commitMessageFetcher.fetchGuarded(
+            "testProject", "1234567891123456789212345678931234567894"))
+        .thenReturn(
             "Subject references bug#42.\n"
                 + "Body references bug#16.\n"
                 + "Body also references bug#176.\n"
                 + "\n");
 
-    replayMocks();
-
     IssueExtractor issueExtractor = injector.getInstance(IssueExtractor.class);
     Map<String, Set<String>> actual =
         issueExtractor.getIssueIds("testProject", "1234567891123456789212345678931234567894");
@@ -614,18 +616,18 @@
     assertLogMessageContains("Matching");
     assertLogMessageContains("Matching");
     assertLogMessageContains("Matching");
+
+    verifyOneOrMore(itsConfig).getIssuePattern();
+    verifyOneOrMore(itsConfig).getIssuePatternGroupIndex();
   }
 
   public void testIssueIdsCommitEmpty() {
-    expect(itsConfig.getIssuePattern()).andReturn(Pattern.compile("bug#(\\d+)")).atLeastOnce();
-    expect(itsConfig.getIssuePatternGroupIndex()).andReturn(1).atLeastOnce();
+    when(itsConfig.getIssuePattern()).thenReturn(Pattern.compile("bug#(\\d+)"));
+    when(itsConfig.getIssuePatternGroupIndex()).thenReturn(1);
 
-    expect(
-            commitMessageFetcher.fetchGuarded(
-                "testProject", "1234567891123456789212345678931234567894"))
-        .andReturn("");
-
-    replayMocks();
+    when(commitMessageFetcher.fetchGuarded(
+            "testProject", "1234567891123456789212345678931234567894"))
+        .thenReturn("");
 
     IssueExtractor issueExtractor = injector.getInstance(IssueExtractor.class);
     Map<String, Set<String>> actual =
@@ -637,18 +639,18 @@
     assertLogMessageContains("Matching");
     assertLogMessageContains("Matching");
     assertLogMessageContains("Matching");
+
+    verifyOneOrMore(itsConfig).getIssuePattern();
+    verifyOneOrMore(itsConfig).getIssuePatternGroupIndex();
   }
 
   public void testIssueIdsCommitBlankLine() {
-    expect(itsConfig.getIssuePattern()).andReturn(Pattern.compile("bug#(\\d+)")).atLeastOnce();
-    expect(itsConfig.getIssuePatternGroupIndex()).andReturn(1).atLeastOnce();
+    when(itsConfig.getIssuePattern()).thenReturn(Pattern.compile("bug#(\\d+)"));
+    when(itsConfig.getIssuePatternGroupIndex()).thenReturn(1);
 
-    expect(
-            commitMessageFetcher.fetchGuarded(
-                "testProject", "1234567891123456789212345678931234567894"))
-        .andReturn("\n");
-
-    replayMocks();
+    when(commitMessageFetcher.fetchGuarded(
+            "testProject", "1234567891123456789212345678931234567894"))
+        .thenReturn("\n");
 
     IssueExtractor issueExtractor = injector.getInstance(IssueExtractor.class);
     Map<String, Set<String>> actual =
@@ -658,18 +660,18 @@
     assertEquals("Extracted issues do not match", expected, actual);
 
     assertLogMessageContains("Matching");
+
+    verifyOneOrMore(itsConfig).getIssuePattern();
+    verifyOneOrMore(itsConfig).getIssuePatternGroupIndex();
   }
 
   public void testIssueIdsCommitBlankLines() {
-    expect(itsConfig.getIssuePattern()).andReturn(Pattern.compile("bug#(\\d+)")).atLeastOnce();
-    expect(itsConfig.getIssuePatternGroupIndex()).andReturn(1).atLeastOnce();
+    when(itsConfig.getIssuePattern()).thenReturn(Pattern.compile("bug#(\\d+)"));
+    when(itsConfig.getIssuePatternGroupIndex()).thenReturn(1);
 
-    expect(
-            commitMessageFetcher.fetchGuarded(
-                "testProject", "1234567891123456789212345678931234567894"))
-        .andReturn("\n\n");
-
-    replayMocks();
+    when(commitMessageFetcher.fetchGuarded(
+            "testProject", "1234567891123456789212345678931234567894"))
+        .thenReturn("\n\n");
 
     IssueExtractor issueExtractor = injector.getInstance(IssueExtractor.class);
     Map<String, Set<String>> actual =
@@ -679,18 +681,18 @@
     assertEquals("Extracted issues do not match", expected, actual);
 
     assertLogMessageContains("Matching");
+
+    verifyOneOrMore(itsConfig).getIssuePattern();
+    verifyOneOrMore(itsConfig).getIssuePatternGroupIndex();
   }
 
   public void testIssueIdsCommitMoreBlankLines() {
-    expect(itsConfig.getIssuePattern()).andReturn(Pattern.compile("bug#(\\d+)")).atLeastOnce();
-    expect(itsConfig.getIssuePatternGroupIndex()).andReturn(1).atLeastOnce();
+    when(itsConfig.getIssuePattern()).thenReturn(Pattern.compile("bug#(\\d+)"));
+    when(itsConfig.getIssuePatternGroupIndex()).thenReturn(1);
 
-    expect(
-            commitMessageFetcher.fetchGuarded(
-                "testProject", "1234567891123456789212345678931234567894"))
-        .andReturn("\n\n\n");
-
-    replayMocks();
+    when(commitMessageFetcher.fetchGuarded(
+            "testProject", "1234567891123456789212345678931234567894"))
+        .thenReturn("\n\n\n");
 
     IssueExtractor issueExtractor = injector.getInstance(IssueExtractor.class);
     Map<String, Set<String>> actual =
@@ -700,16 +702,18 @@
     assertEquals("Extracted issues do not match", expected, actual);
 
     assertLogMessageContains("Matching");
+
+    verifyOneOrMore(itsConfig).getIssuePattern();
+    verifyOneOrMore(itsConfig).getIssuePatternGroupIndex();
   }
 
   public void testIssueIdsCommitMixed() {
-    expect(itsConfig.getIssuePattern()).andReturn(Pattern.compile("bug#(\\d+)")).atLeastOnce();
-    expect(itsConfig.getIssuePatternGroupIndex()).andReturn(1).atLeastOnce();
+    when(itsConfig.getIssuePattern()).thenReturn(Pattern.compile("bug#(\\d+)"));
+    when(itsConfig.getIssuePatternGroupIndex()).thenReturn(1);
 
-    expect(
-            commitMessageFetcher.fetchGuarded(
-                "testProject", "1234567891123456789212345678931234567894"))
-        .andReturn(
+    when(commitMessageFetcher.fetchGuarded(
+            "testProject", "1234567891123456789212345678931234567894"))
+        .thenReturn(
             "Subject bug#42, bug#1984, and bug#16\n"
                 + "\n"
                 + "bug#4711 in body,\n"
@@ -719,8 +723,6 @@
                 + "Bug: bug#176, bug#1984, and bug#5150\n"
                 + "Change-Id: I1234567891123456789212345678931234567894");
 
-    replayMocks();
-
     IssueExtractor issueExtractor = injector.getInstance(IssueExtractor.class);
     Map<String, Set<String>> actual =
         issueExtractor.getIssueIds("testProject", "1234567891123456789212345678931234567894");
@@ -740,18 +742,18 @@
     assertLogMessageContains("Matching");
     assertLogMessageContains("Matching");
     assertLogMessageContains("Matching");
+
+    verifyOneOrMore(itsConfig).getIssuePattern();
+    verifyOneOrMore(itsConfig).getIssuePatternGroupIndex();
   }
 
   public void testIssueIdsCommitWAddedEmptyFirst() {
-    expect(itsConfig.getIssuePattern()).andReturn(Pattern.compile("bug#(\\d+)")).atLeastOnce();
-    expect(itsConfig.getIssuePatternGroupIndex()).andReturn(1).atLeastOnce();
+    when(itsConfig.getIssuePattern()).thenReturn(Pattern.compile("bug#(\\d+)"));
+    when(itsConfig.getIssuePatternGroupIndex()).thenReturn(1);
 
-    expect(
-            commitMessageFetcher.fetchGuarded(
-                "testProject", "1234567891123456789212345678931234567894"))
-        .andReturn("");
-
-    replayMocks();
+    when(commitMessageFetcher.fetchGuarded(
+            "testProject", "1234567891123456789212345678931234567894"))
+        .thenReturn("");
 
     PatchSet.Id patchSetId = PatchSet.id(Change.id(4), 1);
     IssueExtractor issueExtractor = injector.getInstance(IssueExtractor.class);
@@ -765,24 +767,24 @@
     assertLogMessageContains("Matching");
     assertLogMessageContains("Matching");
     assertLogMessageContains("Matching");
+
+    verifyOneOrMore(itsConfig).getIssuePattern();
+    verifyOneOrMore(itsConfig).getIssuePatternGroupIndex();
   }
 
   public void testIssueIdsCommitWAddedSingleSubjectIssueFirst() {
-    expect(itsConfig.getIssuePattern()).andReturn(Pattern.compile("bug#(\\d+)")).atLeastOnce();
-    expect(itsConfig.getIssuePatternGroupIndex()).andReturn(1).atLeastOnce();
+    when(itsConfig.getIssuePattern()).thenReturn(Pattern.compile("bug#(\\d+)"));
+    when(itsConfig.getIssuePatternGroupIndex()).thenReturn(1);
 
-    Change.Id changeId = createMock(Change.Id.class);
+    Change.Id changeId = mock(Change.Id.class);
 
-    expect(
-            commitMessageFetcher.fetchGuarded(
-                "testProject", "1234567891123456789212345678931234567894"))
-        .andReturn("bug#42\n" + "\n" + "Change-Id: I1234567891123456789212345678931234567894");
+    when(commitMessageFetcher.fetchGuarded(
+            "testProject", "1234567891123456789212345678931234567894"))
+        .thenReturn("bug#42\n" + "\n" + "Change-Id: I1234567891123456789212345678931234567894");
 
-    PatchSet.Id currentPatchSetId = createMock(PatchSet.Id.class);
-    expect(currentPatchSetId.get()).andReturn(1).anyTimes();
-    expect(currentPatchSetId.changeId()).andReturn(changeId).anyTimes();
-
-    replayMocks();
+    PatchSet.Id currentPatchSetId = mock(PatchSet.Id.class);
+    when(currentPatchSetId.get()).thenReturn(1);
+    when(currentPatchSetId.changeId()).thenReturn(changeId);
 
     IssueExtractor issueExtractor = injector.getInstance(IssueExtractor.class);
     Map<String, Set<String>> actual =
@@ -798,35 +800,33 @@
     assertLogMessageContains("Matching");
     assertLogMessageContains("Matching");
     assertLogMessageContains("Matching");
+
+    verifyOneOrMore(itsConfig).getIssuePattern();
+    verifyOneOrMore(itsConfig).getIssuePatternGroupIndex();
   }
 
   public void testIssueIdsCommitWAddedSingleSubjectIssueSecondEmpty() {
-    expect(itsConfig.getIssuePattern()).andReturn(Pattern.compile("bug#(\\d+)")).atLeastOnce();
-    expect(itsConfig.getIssuePatternGroupIndex()).andReturn(1).atLeastOnce();
+    when(itsConfig.getIssuePattern()).thenReturn(Pattern.compile("bug#(\\d+)"));
+    when(itsConfig.getIssuePatternGroupIndex()).thenReturn(1);
 
-    Change.Id changeId = createMock(Change.Id.class);
+    Change.Id changeId = mock(Change.Id.class);
 
     // Call for current patch set
-    expect(
-            commitMessageFetcher.fetchGuarded(
-                "testProject", "1234567891123456789212345678931234567894"))
-        .andReturn("bug#42\n" + "\n" + "Change-Id: I1234567891123456789212345678931234567894");
+    when(commitMessageFetcher.fetchGuarded(
+            "testProject", "1234567891123456789212345678931234567894"))
+        .thenReturn("bug#42\n" + "\n" + "Change-Id: I1234567891123456789212345678931234567894");
 
     // Call for previous patch set
     PatchSet.Id previousPatchSetId = PatchSet.id(changeId, 1);
-    expect(db.getRevision(previousPatchSetId))
-        .andReturn("9876543211987654321298765432139876543214");
+    when(db.getRevision(previousPatchSetId)).thenReturn("9876543211987654321298765432139876543214");
 
-    expect(
-            commitMessageFetcher.fetchGuarded(
-                "testProject", "9876543211987654321298765432139876543214"))
-        .andReturn("subject\n" + "\n" + "Change-Id: I9876543211987654321298765432139876543214");
+    when(commitMessageFetcher.fetchGuarded(
+            "testProject", "9876543211987654321298765432139876543214"))
+        .thenReturn("subject\n" + "\n" + "Change-Id: I9876543211987654321298765432139876543214");
 
-    PatchSet.Id currentPatchSetId = createMock(PatchSet.Id.class);
-    expect(currentPatchSetId.get()).andReturn(2).anyTimes();
-    expect(currentPatchSetId.changeId()).andReturn(changeId).anyTimes();
-
-    replayMocks();
+    PatchSet.Id currentPatchSetId = mock(PatchSet.Id.class);
+    when(currentPatchSetId.get()).thenReturn(2);
+    when(currentPatchSetId.changeId()).thenReturn(changeId);
 
     IssueExtractor issueExtractor = injector.getInstance(IssueExtractor.class);
     Map<String, Set<String>> actual =
@@ -847,35 +847,33 @@
     assertLogMessageContains("Matching");
     assertLogMessageContains("Matching");
     assertLogMessageContains("Matching");
+
+    verifyOneOrMore(itsConfig).getIssuePattern();
+    verifyOneOrMore(itsConfig).getIssuePatternGroupIndex();
   }
 
   public void testIssueIdsCommitWAddedSingleSubjectIssueSecondSame() {
-    expect(itsConfig.getIssuePattern()).andReturn(Pattern.compile("bug#(\\d+)")).atLeastOnce();
-    expect(itsConfig.getIssuePatternGroupIndex()).andReturn(1).atLeastOnce();
+    when(itsConfig.getIssuePattern()).thenReturn(Pattern.compile("bug#(\\d+)"));
+    when(itsConfig.getIssuePatternGroupIndex()).thenReturn(1);
 
-    Change.Id changeId = createMock(Change.Id.class);
+    Change.Id changeId = mock(Change.Id.class);
 
     // Call for current patch set
-    expect(
-            commitMessageFetcher.fetchGuarded(
-                "testProject", "1234567891123456789212345678931234567894"))
-        .andReturn("bug#42\n" + "\n" + "Change-Id: I1234567891123456789212345678931234567894");
+    when(commitMessageFetcher.fetchGuarded(
+            "testProject", "1234567891123456789212345678931234567894"))
+        .thenReturn("bug#42\n" + "\n" + "Change-Id: I1234567891123456789212345678931234567894");
 
     // Call for previous patch set
     PatchSet.Id previousPatchSetId = PatchSet.id(changeId, 1);
-    expect(
-            commitMessageFetcher.fetchGuarded(
-                "testProject", "9876543211987654321298765432139876543214"))
-        .andReturn("bug#42\n" + "\n" + "Change-Id: I9876543211987654321298765432139876543214");
+    when(commitMessageFetcher.fetchGuarded(
+            "testProject", "9876543211987654321298765432139876543214"))
+        .thenReturn("bug#42\n" + "\n" + "Change-Id: I9876543211987654321298765432139876543214");
 
-    expect(db.getRevision(previousPatchSetId))
-        .andReturn("9876543211987654321298765432139876543214");
+    when(db.getRevision(previousPatchSetId)).thenReturn("9876543211987654321298765432139876543214");
 
-    PatchSet.Id currentPatchSetId = createMock(PatchSet.Id.class);
-    expect(currentPatchSetId.get()).andReturn(2).anyTimes();
-    expect(currentPatchSetId.changeId()).andReturn(changeId).anyTimes();
-
-    replayMocks();
+    PatchSet.Id currentPatchSetId = mock(PatchSet.Id.class);
+    when(currentPatchSetId.get()).thenReturn(2);
+    when(currentPatchSetId.changeId()).thenReturn(changeId);
 
     IssueExtractor issueExtractor = injector.getInstance(IssueExtractor.class);
     Map<String, Set<String>> actual =
@@ -896,39 +894,37 @@
     assertLogMessageContains("Matching");
     assertLogMessageContains("Matching");
     assertLogMessageContains("Matching");
+
+    verifyOneOrMore(itsConfig).getIssuePattern();
+    verifyOneOrMore(itsConfig).getIssuePatternGroupIndex();
   }
 
   public void testIssueIdsCommitWAddedSingleSubjectIssueSecondBody() {
-    expect(itsConfig.getIssuePattern()).andReturn(Pattern.compile("bug#(\\d+)")).atLeastOnce();
-    expect(itsConfig.getIssuePatternGroupIndex()).andReturn(1).atLeastOnce();
+    when(itsConfig.getIssuePattern()).thenReturn(Pattern.compile("bug#(\\d+)"));
+    when(itsConfig.getIssuePatternGroupIndex()).thenReturn(1);
 
-    Change.Id changeId = createMock(Change.Id.class);
+    Change.Id changeId = mock(Change.Id.class);
 
     // Call for current patch set
-    expect(
-            commitMessageFetcher.fetchGuarded(
-                "testProject", "1234567891123456789212345678931234567894"))
-        .andReturn("bug#42\n" + "\n" + "Change-Id: I1234567891123456789212345678931234567894");
+    when(commitMessageFetcher.fetchGuarded(
+            "testProject", "1234567891123456789212345678931234567894"))
+        .thenReturn("bug#42\n" + "\n" + "Change-Id: I1234567891123456789212345678931234567894");
 
     // Call for previous patch set
     PatchSet.Id previousPatchSetId = PatchSet.id(changeId, 1);
-    expect(
-            commitMessageFetcher.fetchGuarded(
-                "testProject", "9876543211987654321298765432139876543214"))
-        .andReturn(
+    when(commitMessageFetcher.fetchGuarded(
+            "testProject", "9876543211987654321298765432139876543214"))
+        .thenReturn(
             "subject\n"
                 + "bug#42\n"
                 + "\n"
                 + "Change-Id: I9876543211987654321298765432139876543214");
 
-    expect(db.getRevision(previousPatchSetId))
-        .andReturn("9876543211987654321298765432139876543214");
+    when(db.getRevision(previousPatchSetId)).thenReturn("9876543211987654321298765432139876543214");
 
-    PatchSet.Id currentPatchSetId = createMock(PatchSet.Id.class);
-    expect(currentPatchSetId.get()).andReturn(2).anyTimes();
-    expect(currentPatchSetId.changeId()).andReturn(changeId).anyTimes();
-
-    replayMocks();
+    PatchSet.Id currentPatchSetId = mock(PatchSet.Id.class);
+    when(currentPatchSetId.get()).thenReturn(2);
+    when(currentPatchSetId.changeId()).thenReturn(changeId);
 
     IssueExtractor issueExtractor = injector.getInstance(IssueExtractor.class);
     Map<String, Set<String>> actual =
@@ -949,19 +945,21 @@
     assertLogMessageContains("Matching");
     assertLogMessageContains("Matching");
     assertLogMessageContains("Matching");
+
+    verifyOneOrMore(itsConfig).getIssuePattern();
+    verifyOneOrMore(itsConfig).getIssuePatternGroupIndex();
   }
 
   public void testIssueIdsCommitWAddedSingleSubjectIssueSecondFooter() {
-    expect(itsConfig.getIssuePattern()).andReturn(Pattern.compile("bug#(\\d+)")).atLeastOnce();
-    expect(itsConfig.getIssuePatternGroupIndex()).andReturn(1).atLeastOnce();
+    when(itsConfig.getIssuePattern()).thenReturn(Pattern.compile("bug#(\\d+)"));
+    when(itsConfig.getIssuePatternGroupIndex()).thenReturn(1);
 
-    Change.Id changeId = createMock(Change.Id.class);
+    Change.Id changeId = mock(Change.Id.class);
 
     // Call for current patch set
-    expect(
-            commitMessageFetcher.fetchGuarded(
-                "testProject", "1234567891123456789212345678931234567894"))
-        .andReturn(
+    when(commitMessageFetcher.fetchGuarded(
+            "testProject", "1234567891123456789212345678931234567894"))
+        .thenReturn(
             "subject\n"
                 + "\n"
                 + "Bug: bug#42\n"
@@ -969,19 +967,15 @@
 
     // Call for previous patch set
     PatchSet.Id previousPatchSetId = PatchSet.id(changeId, 1);
-    expect(
-            commitMessageFetcher.fetchGuarded(
-                "testProject", "9876543211987654321298765432139876543214"))
-        .andReturn("bug#42\n" + "\n" + "Change-Id: I9876543211987654321298765432139876543214");
+    when(commitMessageFetcher.fetchGuarded(
+            "testProject", "9876543211987654321298765432139876543214"))
+        .thenReturn("bug#42\n" + "\n" + "Change-Id: I9876543211987654321298765432139876543214");
 
-    expect(db.getRevision(previousPatchSetId))
-        .andReturn("9876543211987654321298765432139876543214");
+    when(db.getRevision(previousPatchSetId)).thenReturn("9876543211987654321298765432139876543214");
 
-    PatchSet.Id currentPatchSetId = createMock(PatchSet.Id.class);
-    expect(currentPatchSetId.get()).andReturn(2).anyTimes();
-    expect(currentPatchSetId.changeId()).andReturn(changeId).anyTimes();
-
-    replayMocks();
+    PatchSet.Id currentPatchSetId = mock(PatchSet.Id.class);
+    when(currentPatchSetId.get()).thenReturn(2);
+    when(currentPatchSetId.changeId()).thenReturn(changeId);
 
     IssueExtractor issueExtractor = injector.getInstance(IssueExtractor.class);
     Map<String, Set<String>> actual =
@@ -1005,19 +999,21 @@
     assertLogMessageContains("Matching");
     assertLogMessageContains("Matching");
     assertLogMessageContains("Matching");
+
+    verifyOneOrMore(itsConfig).getIssuePattern();
+    verifyOneOrMore(itsConfig).getIssuePatternGroupIndex();
   }
 
   public void testIssueIdsCommitWAddedSubjectFooter() {
-    expect(itsConfig.getIssuePattern()).andReturn(Pattern.compile("bug#(\\d+)")).atLeastOnce();
-    expect(itsConfig.getIssuePatternGroupIndex()).andReturn(1).atLeastOnce();
+    when(itsConfig.getIssuePattern()).thenReturn(Pattern.compile("bug#(\\d+)"));
+    when(itsConfig.getIssuePatternGroupIndex()).thenReturn(1);
 
-    Change.Id changeId = createMock(Change.Id.class);
+    Change.Id changeId = mock(Change.Id.class);
 
     // Call for current patch set
-    expect(
-            commitMessageFetcher.fetchGuarded(
-                "testProject", "1234567891123456789212345678931234567894"))
-        .andReturn(
+    when(commitMessageFetcher.fetchGuarded(
+            "testProject", "1234567891123456789212345678931234567894"))
+        .thenReturn(
             "subject bug#42\n"
                 + "\n"
                 + "body bug#42\n"
@@ -1027,23 +1023,19 @@
 
     // Call for previous patch set
     PatchSet.Id previousPatchSetId = PatchSet.id(changeId, 1);
-    expect(
-            commitMessageFetcher.fetchGuarded(
-                "testProject", "9876543211987654321298765432139876543214"))
-        .andReturn(
+    when(commitMessageFetcher.fetchGuarded(
+            "testProject", "9876543211987654321298765432139876543214"))
+        .thenReturn(
             "subject\n"
                 + "bug#42\n"
                 + "\n"
                 + "Change-Id: I9876543211987654321298765432139876543214");
 
-    expect(db.getRevision(previousPatchSetId))
-        .andReturn("9876543211987654321298765432139876543214");
+    when(db.getRevision(previousPatchSetId)).thenReturn("9876543211987654321298765432139876543214");
 
-    PatchSet.Id currentPatchSetId = createMock(PatchSet.Id.class);
-    expect(currentPatchSetId.get()).andReturn(2).anyTimes();
-    expect(currentPatchSetId.changeId()).andReturn(changeId).anyTimes();
-
-    replayMocks();
+    PatchSet.Id currentPatchSetId = mock(PatchSet.Id.class);
+    when(currentPatchSetId.get()).thenReturn(2);
+    when(currentPatchSetId.changeId()).thenReturn(changeId);
 
     IssueExtractor issueExtractor = injector.getInstance(IssueExtractor.class);
     Map<String, Set<String>> actual =
@@ -1075,19 +1067,21 @@
     assertLogMessageContains("Matching");
     assertLogMessageContains("Matching");
     assertLogMessageContains("Matching");
+
+    verifyOneOrMore(itsConfig).getIssuePattern();
+    verifyOneOrMore(itsConfig).getIssuePatternGroupIndex();
   }
 
   public void testIssueIdsCommitWAddedMultiple() {
-    expect(itsConfig.getIssuePattern()).andReturn(Pattern.compile("bug#(\\d+)")).atLeastOnce();
-    expect(itsConfig.getIssuePatternGroupIndex()).andReturn(1).atLeastOnce();
+    when(itsConfig.getIssuePattern()).thenReturn(Pattern.compile("bug#(\\d+)"));
+    when(itsConfig.getIssuePatternGroupIndex()).thenReturn(1);
 
-    Change.Id changeId = createMock(Change.Id.class);
+    Change.Id changeId = mock(Change.Id.class);
 
     // Call for current patch set
-    expect(
-            commitMessageFetcher.fetchGuarded(
-                "testProject", "1234567891123456789212345678931234567894"))
-        .andReturn(
+    when(commitMessageFetcher.fetchGuarded(
+            "testProject", "1234567891123456789212345678931234567894"))
+        .thenReturn(
             "subject bug#42\n"
                 + "\n"
                 + "body bug#42 bug#16\n"
@@ -1097,24 +1091,20 @@
 
     // Call for previous patch set
     PatchSet.Id previousPatchSetId = PatchSet.id(changeId, 1);
-    expect(
-            commitMessageFetcher.fetchGuarded(
-                "testProject", "9876543211987654321298765432139876543214"))
-        .andReturn(
+    when(commitMessageFetcher.fetchGuarded(
+            "testProject", "9876543211987654321298765432139876543214"))
+        .thenReturn(
             "subject\n"
                 + "bug#42 bug#4711\n"
                 + "\n"
                 + "Bug: bug#16\n"
                 + "Change-Id: I9876543211987654321298765432139876543214");
 
-    expect(db.getRevision(previousPatchSetId))
-        .andReturn("9876543211987654321298765432139876543214");
+    when(db.getRevision(previousPatchSetId)).thenReturn("9876543211987654321298765432139876543214");
 
-    PatchSet.Id currentPatchSetId = createMock(PatchSet.Id.class);
-    expect(currentPatchSetId.get()).andReturn(2).anyTimes();
-    expect(currentPatchSetId.changeId()).andReturn(changeId).anyTimes();
-
-    replayMocks();
+    PatchSet.Id currentPatchSetId = mock(PatchSet.Id.class);
+    when(currentPatchSetId.get()).thenReturn(2);
+    when(currentPatchSetId.changeId()).thenReturn(changeId);
 
     IssueExtractor issueExtractor = injector.getInstance(IssueExtractor.class);
     Map<String, Set<String>> actual =
@@ -1148,6 +1138,13 @@
     assertLogMessageContains("Matching");
     assertLogMessageContains("Matching");
     assertLogMessageContains("Matching");
+
+    verifyOneOrMore(itsConfig).getIssuePattern();
+    verifyOneOrMore(itsConfig).getIssuePatternGroupIndex();
+  }
+
+  private <T> T verifyOneOrMore(T mock) {
+    return verify(mock, atLeastOnce());
   }
 
   @Override
@@ -1160,13 +1157,13 @@
   private class TestModule extends FactoryModule {
     @Override
     protected void configure() {
-      itsConfig = createMock(ItsConfig.class);
+      itsConfig = mock(ItsConfig.class);
       bind(ItsConfig.class).toInstance(itsConfig);
 
-      commitMessageFetcher = createMock(CommitMessageFetcher.class);
+      commitMessageFetcher = mock(CommitMessageFetcher.class);
       bind(CommitMessageFetcher.class).toInstance(commitMessageFetcher);
 
-      db = createMock(PatchSetDb.class);
+      db = mock(PatchSetDb.class);
       bind(PatchSetDb.class).toInstance(db);
     }
   }
diff --git a/src/test/java/com/googlesource/gerrit/plugins/its/base/util/ItsProjectExtractorTest.java b/src/test/java/com/googlesource/gerrit/plugins/its/base/util/ItsProjectExtractorTest.java
index 48bac21..2fbca57 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/its/base/util/ItsProjectExtractorTest.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/its/base/util/ItsProjectExtractorTest.java
@@ -14,17 +14,18 @@
 
 package com.googlesource.gerrit.plugins.its.base.util;
 
-import static org.easymock.EasyMock.expect;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
 
 import com.google.gerrit.entities.Project;
 import com.google.gerrit.extensions.config.FactoryModule;
 import com.google.inject.Guice;
 import com.google.inject.Injector;
 import com.googlesource.gerrit.plugins.its.base.its.ItsConfig;
-import com.googlesource.gerrit.plugins.its.base.testutil.MockingTestCase;
 import java.util.Optional;
+import junit.framework.TestCase;
 
-public class ItsProjectExtractorTest extends MockingTestCase {
+public class ItsProjectExtractorTest extends TestCase {
 
   private static final String PROJECT = "project";
   private static final String ITS_PROJECT = "itsProject";
@@ -35,11 +36,9 @@
   public void test() {
     ItsProjectExtractor projectExtractor = injector.getInstance(ItsProjectExtractor.class);
 
-    expect(itsConfig.getItsProjectName(Project.nameKey(PROJECT)))
-        .andReturn(Optional.of(ITS_PROJECT))
-        .once();
-
-    replayMocks();
+    when(itsConfig.getItsProjectName(Project.nameKey(PROJECT)))
+        .thenReturn(Optional.of(ITS_PROJECT))
+        .thenThrow(new UnsupportedOperationException("Method more than once"));
 
     String ret = projectExtractor.getItsProject(PROJECT).orElse(null);
     assertEquals(ret, ITS_PROJECT);
@@ -55,7 +54,7 @@
   private class TestModule extends FactoryModule {
     @Override
     protected void configure() {
-      itsConfig = createMock(ItsConfig.class);
+      itsConfig = mock(ItsConfig.class);
       bind(ItsConfig.class).toInstance(itsConfig);
     }
   }
diff --git a/src/test/java/com/googlesource/gerrit/plugins/its/base/util/PropertyAttributeExtractorTest.java b/src/test/java/com/googlesource/gerrit/plugins/its/base/util/PropertyAttributeExtractorTest.java
index 1180118..153f1c3 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/its/base/util/PropertyAttributeExtractorTest.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/its/base/util/PropertyAttributeExtractorTest.java
@@ -13,7 +13,8 @@
 // limitations under the License.
 package com.googlesource.gerrit.plugins.its.base.util;
 
-import static org.easymock.EasyMock.expect;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
 
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Lists;
@@ -38,8 +39,6 @@
   private ItsFacade facade;
 
   public void testAccountAttributeNull() {
-    replayMocks();
-
     PropertyAttributeExtractor extractor = injector.getInstance(PropertyAttributeExtractor.class);
 
     Map<String, String> actual = extractor.extractFrom(null, "prefix");
@@ -55,8 +54,6 @@
     accountAttribute.name = "testName";
     accountAttribute.username = "testUsername";
 
-    replayMocks();
-
     PropertyAttributeExtractor extractor = injector.getInstance(PropertyAttributeExtractor.class);
 
     Map<String, String> actual = extractor.extractFrom(accountAttribute, "prefix");
@@ -87,10 +84,8 @@
     changeAttribute.commitMessage = "Commit Message";
     changeAttribute.status = Change.Status.NEW;
 
-    expect(facade.createLinkForWebui("http://www.example.org/test", "http://www.example.org/test"))
-        .andReturn("http://www.example.org/test");
-
-    replayMocks();
+    when(facade.createLinkForWebui("http://www.example.org/test", "http://www.example.org/test"))
+        .thenReturn("http://www.example.org/test");
 
     PropertyAttributeExtractor extractor = injector.getInstance(PropertyAttributeExtractor.class);
 
@@ -133,10 +128,8 @@
     changeAttribute.commitMessage = "Commit Message";
     changeAttribute.status = Change.Status.NEW;
 
-    expect(facade.createLinkForWebui("http://www.example.org/test", "http://www.example.org/test"))
-        .andReturn("http://www.example.org/test");
-
-    replayMocks();
+    when(facade.createLinkForWebui("http://www.example.org/test", "http://www.example.org/test"))
+        .thenReturn("http://www.example.org/test");
 
     PropertyAttributeExtractor extractor = injector.getInstance(PropertyAttributeExtractor.class);
 
@@ -179,10 +172,8 @@
     changeAttribute.owner = owner;
     changeAttribute.commitMessage = "Commit Message";
 
-    expect(facade.createLinkForWebui("http://www.example.org/test", "http://www.example.org/test"))
-        .andReturn("http://www.example.org/test");
-
-    replayMocks();
+    when(facade.createLinkForWebui("http://www.example.org/test", "http://www.example.org/test"))
+        .thenReturn("http://www.example.org/test");
 
     PropertyAttributeExtractor extractor = injector.getInstance(PropertyAttributeExtractor.class);
 
@@ -231,8 +222,6 @@
     patchSetAttribute.uploader = uploader;
     patchSetAttribute.author = author;
 
-    replayMocks();
-
     PropertyAttributeExtractor extractor = injector.getInstance(PropertyAttributeExtractor.class);
 
     Map<String, String> actual = extractor.extractFrom(patchSetAttribute);
@@ -262,8 +251,6 @@
     refUpdateAttribute.oldRev = "9876543211987654321298765432139876543214";
     refUpdateAttribute.refName = "refs/heads/master";
 
-    replayMocks();
-
     PropertyAttributeExtractor extractor = injector.getInstance(PropertyAttributeExtractor.class);
 
     Map<String, String> actual = extractor.extractFrom(refUpdateAttribute);
@@ -284,8 +271,6 @@
     approvalAttribute.type = "TestType";
     approvalAttribute.value = "TestValue";
 
-    replayMocks();
-
     PropertyAttributeExtractor extractor = injector.getInstance(PropertyAttributeExtractor.class);
 
     Map<String, String> actual = extractor.extractFrom(approvalAttribute);
@@ -299,8 +284,6 @@
     approvalAttribute.type = "Test-Type";
     approvalAttribute.value = "TestValue";
 
-    replayMocks();
-
     PropertyAttributeExtractor extractor = injector.getInstance(PropertyAttributeExtractor.class);
 
     Map<String, String> actual = extractor.extractFrom(approvalAttribute);
@@ -318,7 +301,7 @@
   private class TestModule extends FactoryModule {
     @Override
     protected void configure() {
-      facade = createMock(ItsFacade.class);
+      facade = mock(ItsFacade.class);
       bind(ItsFacade.class).toInstance(facade);
     }
   }
diff --git a/src/test/java/com/googlesource/gerrit/plugins/its/base/util/PropertyExtractorTest.java b/src/test/java/com/googlesource/gerrit/plugins/its/base/util/PropertyExtractorTest.java
index 09e7fc4..ac7ea92 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/its/base/util/PropertyExtractorTest.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/its/base/util/PropertyExtractorTest.java
@@ -13,7 +13,8 @@
 // limitations under the License.
 package com.googlesource.gerrit.plugins.its.base.util;
 
-import static org.easymock.EasyMock.expect;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
 
 import com.google.common.base.Suppliers;
 import com.google.common.collect.ImmutableMap;
@@ -56,9 +57,7 @@
   public void testDummyChangeEvent() {
     PropertyExtractor propertyExtractor = injector.getInstance(PropertyExtractor.class);
 
-    expect(itsProjectExtractor.getItsProject("testProject")).andReturn(Optional.empty());
-
-    replayMocks();
+    when(itsProjectExtractor.getItsProject("testProject")).thenReturn(Optional.empty());
 
     Set<Map<String, String>> actual =
         propertyExtractor.extractFrom(new DummyEvent()).getIssuesProperties();
@@ -70,25 +69,25 @@
   public void testChangeAbandonedEvent() {
     ChangeAbandonedEvent event = new ChangeAbandonedEvent(testChange("testProject", "testBranch"));
 
-    expect(itsProjectExtractor.getItsProject("testProject")).andReturn(Optional.empty());
+    when(itsProjectExtractor.getItsProject("testProject")).thenReturn(Optional.empty());
 
-    ChangeAttribute changeAttribute = createMock(ChangeAttribute.class);
+    ChangeAttribute changeAttribute = mock(ChangeAttribute.class);
     event.change = Suppliers.ofInstance(changeAttribute);
     Map<String, String> changeProperties =
         ImmutableMap.of("project", "testProject", "changeNumber", "176");
-    expect(propertyAttributeExtractor.extractFrom(changeAttribute)).andReturn(changeProperties);
+    when(propertyAttributeExtractor.extractFrom(changeAttribute)).thenReturn(changeProperties);
 
-    AccountAttribute accountAttribute = createMock(AccountAttribute.class);
+    AccountAttribute accountAttribute = mock(AccountAttribute.class);
     event.abandoner = Suppliers.ofInstance(accountAttribute);
     Map<String, String> accountProperties = ImmutableMap.of("abandonerName", "testName");
-    expect(propertyAttributeExtractor.extractFrom(accountAttribute, "abandoner"))
-        .andReturn(accountProperties);
+    when(propertyAttributeExtractor.extractFrom(accountAttribute, "abandoner"))
+        .thenReturn(accountProperties);
 
-    PatchSetAttribute patchSetAttribute = createMock(PatchSetAttribute.class);
+    PatchSetAttribute patchSetAttribute = mock(PatchSetAttribute.class);
     event.patchSet = Suppliers.ofInstance(patchSetAttribute);
     Map<String, String> patchSetProperties =
         ImmutableMap.of("revision", "testRevision", "patchSetNumber", "3");
-    expect(propertyAttributeExtractor.extractFrom(patchSetAttribute)).andReturn(patchSetProperties);
+    when(propertyAttributeExtractor.extractFrom(patchSetAttribute)).thenReturn(patchSetProperties);
 
     event.reason = "testReason";
     changeAttribute.project = "testProject";
@@ -111,25 +110,25 @@
   public void testChangeMergedEvent() {
     ChangeMergedEvent event = new ChangeMergedEvent(testChange("testProject", "testBranch"));
 
-    expect(itsProjectExtractor.getItsProject("testProject")).andReturn(Optional.empty());
+    when(itsProjectExtractor.getItsProject("testProject")).thenReturn(Optional.empty());
 
-    ChangeAttribute changeAttribute = createMock(ChangeAttribute.class);
+    ChangeAttribute changeAttribute = mock(ChangeAttribute.class);
     event.change = Suppliers.ofInstance(changeAttribute);
     Map<String, String> changeProperties =
         ImmutableMap.of("project", "testProject", "changeNumber", "176");
-    expect(propertyAttributeExtractor.extractFrom(changeAttribute)).andReturn(changeProperties);
+    when(propertyAttributeExtractor.extractFrom(changeAttribute)).thenReturn(changeProperties);
 
-    AccountAttribute accountAttribute = createMock(AccountAttribute.class);
+    AccountAttribute accountAttribute = mock(AccountAttribute.class);
     event.submitter = Suppliers.ofInstance(accountAttribute);
     Map<String, String> accountProperties = ImmutableMap.of("submitterName", "testName");
-    expect(propertyAttributeExtractor.extractFrom(accountAttribute, "submitter"))
-        .andReturn(accountProperties);
+    when(propertyAttributeExtractor.extractFrom(accountAttribute, "submitter"))
+        .thenReturn(accountProperties);
 
-    PatchSetAttribute patchSetAttribute = createMock(PatchSetAttribute.class);
+    PatchSetAttribute patchSetAttribute = mock(PatchSetAttribute.class);
     event.patchSet = Suppliers.ofInstance(patchSetAttribute);
     Map<String, String> patchSetProperties =
         ImmutableMap.of("revision", "testRevision", "patchSetNumber", "3");
-    expect(propertyAttributeExtractor.extractFrom(patchSetAttribute)).andReturn(patchSetProperties);
+    when(propertyAttributeExtractor.extractFrom(patchSetAttribute)).thenReturn(patchSetProperties);
 
     changeAttribute.project = "testProject";
     changeAttribute.number = 176;
@@ -150,25 +149,25 @@
   public void testChangeRestoredEvent() {
     ChangeRestoredEvent event = new ChangeRestoredEvent(testChange("testProject", "testBranch"));
 
-    expect(itsProjectExtractor.getItsProject("testProject")).andReturn(Optional.empty());
+    when(itsProjectExtractor.getItsProject("testProject")).thenReturn(Optional.empty());
 
-    ChangeAttribute changeAttribute = createMock(ChangeAttribute.class);
+    ChangeAttribute changeAttribute = mock(ChangeAttribute.class);
     event.change = Suppliers.ofInstance(changeAttribute);
     Map<String, String> changeProperties =
         ImmutableMap.of("project", "testProject", "changeNumber", "176");
-    expect(propertyAttributeExtractor.extractFrom(changeAttribute)).andReturn(changeProperties);
+    when(propertyAttributeExtractor.extractFrom(changeAttribute)).thenReturn(changeProperties);
 
-    AccountAttribute accountAttribute = createMock(AccountAttribute.class);
+    AccountAttribute accountAttribute = mock(AccountAttribute.class);
     event.restorer = Suppliers.ofInstance(accountAttribute);
     Map<String, String> accountProperties = ImmutableMap.of("restorerName", "testName");
-    expect(propertyAttributeExtractor.extractFrom(accountAttribute, "restorer"))
-        .andReturn(accountProperties);
+    when(propertyAttributeExtractor.extractFrom(accountAttribute, "restorer"))
+        .thenReturn(accountProperties);
 
-    PatchSetAttribute patchSetAttribute = createMock(PatchSetAttribute.class);
+    PatchSetAttribute patchSetAttribute = mock(PatchSetAttribute.class);
     event.patchSet = Suppliers.ofInstance(patchSetAttribute);
     Map<String, String> patchSetProperties =
         ImmutableMap.of("revision", "testRevision", "patchSetNumber", "3");
-    expect(propertyAttributeExtractor.extractFrom(patchSetAttribute)).andReturn(patchSetProperties);
+    when(propertyAttributeExtractor.extractFrom(patchSetAttribute)).thenReturn(patchSetProperties);
 
     event.reason = "testReason";
     changeAttribute.project = "testProject";
@@ -191,25 +190,25 @@
   public void testCommentAddedEventWOApprovals() {
     CommentAddedEvent event = new CommentAddedEvent(testChange("testProject", "testBranch"));
 
-    expect(itsProjectExtractor.getItsProject("testProject")).andReturn(Optional.empty());
+    when(itsProjectExtractor.getItsProject("testProject")).thenReturn(Optional.empty());
 
-    ChangeAttribute changeAttribute = createMock(ChangeAttribute.class);
+    ChangeAttribute changeAttribute = mock(ChangeAttribute.class);
     event.change = Suppliers.ofInstance(changeAttribute);
     Map<String, String> changeProperties =
         ImmutableMap.of("project", "testProject", "changeNumber", "176");
-    expect(propertyAttributeExtractor.extractFrom(changeAttribute)).andReturn(changeProperties);
+    when(propertyAttributeExtractor.extractFrom(changeAttribute)).thenReturn(changeProperties);
 
-    AccountAttribute accountAttribute = createMock(AccountAttribute.class);
+    AccountAttribute accountAttribute = mock(AccountAttribute.class);
     event.author = Suppliers.ofInstance(accountAttribute);
     Map<String, String> accountProperties = ImmutableMap.of("commenterName", "testName");
-    expect(propertyAttributeExtractor.extractFrom(accountAttribute, "commenter"))
-        .andReturn(accountProperties);
+    when(propertyAttributeExtractor.extractFrom(accountAttribute, "commenter"))
+        .thenReturn(accountProperties);
 
-    PatchSetAttribute patchSetAttribute = createMock(PatchSetAttribute.class);
+    PatchSetAttribute patchSetAttribute = mock(PatchSetAttribute.class);
     event.patchSet = Suppliers.ofInstance(patchSetAttribute);
     Map<String, String> patchSetProperties =
         ImmutableMap.of("revision", "testRevision", "patchSetNumber", "3");
-    expect(propertyAttributeExtractor.extractFrom(patchSetAttribute)).andReturn(patchSetProperties);
+    when(propertyAttributeExtractor.extractFrom(patchSetAttribute)).thenReturn(patchSetProperties);
 
     event.comment = "testComment";
     changeAttribute.project = "testProject";
@@ -232,34 +231,34 @@
   public void testCommentAddedEventWApprovals() {
     CommentAddedEvent event = new CommentAddedEvent(testChange("testProject", "testBranch"));
 
-    expect(itsProjectExtractor.getItsProject("testProject")).andReturn(Optional.empty());
+    when(itsProjectExtractor.getItsProject("testProject")).thenReturn(Optional.empty());
 
-    ChangeAttribute changeAttribute = createMock(ChangeAttribute.class);
+    ChangeAttribute changeAttribute = mock(ChangeAttribute.class);
     event.change = Suppliers.ofInstance(changeAttribute);
     Map<String, String> changeProperties =
         ImmutableMap.of("project", "testProject", "changeNumber", "176");
-    expect(propertyAttributeExtractor.extractFrom(changeAttribute)).andReturn(changeProperties);
+    when(propertyAttributeExtractor.extractFrom(changeAttribute)).thenReturn(changeProperties);
 
-    AccountAttribute accountAttribute = createMock(AccountAttribute.class);
+    AccountAttribute accountAttribute = mock(AccountAttribute.class);
     event.author = Suppliers.ofInstance(accountAttribute);
     Map<String, String> accountProperties = ImmutableMap.of("commenterName", "testName");
-    expect(propertyAttributeExtractor.extractFrom(accountAttribute, "commenter"))
-        .andReturn(accountProperties);
+    when(propertyAttributeExtractor.extractFrom(accountAttribute, "commenter"))
+        .thenReturn(accountProperties);
 
-    PatchSetAttribute patchSetAttribute = createMock(PatchSetAttribute.class);
+    PatchSetAttribute patchSetAttribute = mock(PatchSetAttribute.class);
     event.patchSet = Suppliers.ofInstance(patchSetAttribute);
     Map<String, String> patchSetProperties =
         ImmutableMap.of("revision", "testRevision", "patchSetNumber", "3");
-    expect(propertyAttributeExtractor.extractFrom(patchSetAttribute)).andReturn(patchSetProperties);
+    when(propertyAttributeExtractor.extractFrom(patchSetAttribute)).thenReturn(patchSetProperties);
 
-    ApprovalAttribute approvalAttribute1 = createMock(ApprovalAttribute.class);
+    ApprovalAttribute approvalAttribute1 = mock(ApprovalAttribute.class);
     Map<String, String> approuvalProperties1 = ImmutableMap.of("approvalCodeReview", "0");
-    expect(propertyAttributeExtractor.extractFrom(approvalAttribute1))
-        .andReturn(approuvalProperties1);
-    ApprovalAttribute approvalAttribute2 = createMock(ApprovalAttribute.class);
+    when(propertyAttributeExtractor.extractFrom(approvalAttribute1))
+        .thenReturn(approuvalProperties1);
+    ApprovalAttribute approvalAttribute2 = mock(ApprovalAttribute.class);
     Map<String, String> approuvalProperties2 = ImmutableMap.of("approvalVerified", "0");
-    expect(propertyAttributeExtractor.extractFrom(approvalAttribute2))
-        .andReturn(approuvalProperties2);
+    when(propertyAttributeExtractor.extractFrom(approvalAttribute2))
+        .thenReturn(approuvalProperties2);
     ApprovalAttribute[] approvalAttributes = {approvalAttribute1, approvalAttribute2};
     event.approvals = Suppliers.ofInstance(approvalAttributes);
 
@@ -286,25 +285,25 @@
   public void testPatchSetCreatedEvent() {
     PatchSetCreatedEvent event = new PatchSetCreatedEvent(testChange("testProject", "testBranch"));
 
-    expect(itsProjectExtractor.getItsProject("testProject")).andReturn(Optional.empty());
+    when(itsProjectExtractor.getItsProject("testProject")).thenReturn(Optional.empty());
 
-    ChangeAttribute changeAttribute = createMock(ChangeAttribute.class);
+    ChangeAttribute changeAttribute = mock(ChangeAttribute.class);
     event.change = Suppliers.ofInstance(changeAttribute);
     Map<String, String> changeProperties =
         ImmutableMap.of("project", "testProject", "changeNumber", "176");
-    expect(propertyAttributeExtractor.extractFrom(changeAttribute)).andReturn(changeProperties);
+    when(propertyAttributeExtractor.extractFrom(changeAttribute)).thenReturn(changeProperties);
 
-    AccountAttribute accountAttribute = createMock(AccountAttribute.class);
+    AccountAttribute accountAttribute = mock(AccountAttribute.class);
     event.uploader = Suppliers.ofInstance(accountAttribute);
     Map<String, String> accountProperties = ImmutableMap.of("uploaderName", "testName");
-    expect(propertyAttributeExtractor.extractFrom(accountAttribute, "uploader"))
-        .andReturn(accountProperties);
+    when(propertyAttributeExtractor.extractFrom(accountAttribute, "uploader"))
+        .thenReturn(accountProperties);
 
-    PatchSetAttribute patchSetAttribute = createMock(PatchSetAttribute.class);
+    PatchSetAttribute patchSetAttribute = mock(PatchSetAttribute.class);
     event.patchSet = Suppliers.ofInstance(patchSetAttribute);
     Map<String, String> patchSetProperties =
         ImmutableMap.of("revision", "testRevision", "patchSetNumber", "3");
-    expect(propertyAttributeExtractor.extractFrom(patchSetAttribute)).andReturn(patchSetProperties);
+    when(propertyAttributeExtractor.extractFrom(patchSetAttribute)).thenReturn(patchSetProperties);
 
     changeAttribute.project = "testProject";
     changeAttribute.number = 176;
@@ -325,25 +324,25 @@
   public void testRefUpdatedEvent() {
     RefUpdatedEvent event = new RefUpdatedEvent();
 
-    AccountAttribute accountAttribute = createMock(AccountAttribute.class);
+    AccountAttribute accountAttribute = mock(AccountAttribute.class);
     event.submitter = Suppliers.ofInstance(accountAttribute);
     Map<String, String> accountProperties = ImmutableMap.of("submitterName", "testName");
-    expect(propertyAttributeExtractor.extractFrom(accountAttribute, "submitter"))
-        .andReturn(accountProperties);
+    when(propertyAttributeExtractor.extractFrom(accountAttribute, "submitter"))
+        .thenReturn(accountProperties);
 
-    RefUpdateAttribute refUpdateAttribute = createMock(RefUpdateAttribute.class);
+    RefUpdateAttribute refUpdateAttribute = mock(RefUpdateAttribute.class);
     event.refUpdate = Suppliers.ofInstance(refUpdateAttribute);
     Map<String, String> refUpdatedProperties =
         ImmutableMap.of("revision", "testRevision", "revisionOld", "oldRevision");
-    expect(propertyAttributeExtractor.extractFrom(refUpdateAttribute))
-        .andReturn(refUpdatedProperties);
+    when(propertyAttributeExtractor.extractFrom(refUpdateAttribute))
+        .thenReturn(refUpdatedProperties);
 
     refUpdateAttribute.project = "testProject";
     refUpdateAttribute.newRev = "testRevision";
     refUpdateAttribute.oldRev = "oldRevision";
     refUpdateAttribute.refName = "testBranch";
 
-    expect(itsProjectExtractor.getItsProject("testProject")).andReturn(Optional.empty());
+    when(itsProjectExtractor.getItsProject("testProject")).thenReturn(Optional.empty());
 
     Map<String, String> common =
         ImmutableMap.<String, String>builder()
@@ -369,14 +368,12 @@
     issueMap.put("42", Sets.newHashSet("footer", "anywhere"));
     if (withRevision) {
       PatchSet.Id patchSetId = PatchSet.id(Change.id(176), 3);
-      expect(issueExtractor.getIssueIds("testProject", "testRevision", patchSetId))
-          .andReturn(issueMap);
+      when(issueExtractor.getIssueIds("testProject", "testRevision", patchSetId))
+          .thenReturn(issueMap);
     } else {
-      expect(issueExtractor.getIssueIds("testProject", "testRevision")).andReturn(issueMap);
+      when(issueExtractor.getIssueIds("testProject", "testRevision")).thenReturn(issueMap);
     }
 
-    replayMocks();
-
     Set<Map<String, String>> actual = propertyExtractor.extractFrom(event).getIssuesProperties();
 
     Map<String, String> propertiesIssue4711 =
@@ -415,13 +412,13 @@
     protected void configure() {
       bind(String.class).annotatedWith(PluginName.class).toInstance("ItsTestName");
 
-      itsProjectExtractor = createMock(ItsProjectExtractor.class);
+      itsProjectExtractor = mock(ItsProjectExtractor.class);
       bind(ItsProjectExtractor.class).toInstance(itsProjectExtractor);
 
-      issueExtractor = createMock(IssueExtractor.class);
+      issueExtractor = mock(IssueExtractor.class);
       bind(IssueExtractor.class).toInstance(issueExtractor);
 
-      propertyAttributeExtractor = createMock(PropertyAttributeExtractor.class);
+      propertyAttributeExtractor = mock(PropertyAttributeExtractor.class);
       bind(PropertyAttributeExtractor.class).toInstance(propertyAttributeExtractor);
     }
   }
diff --git a/src/test/java/com/googlesource/gerrit/plugins/its/base/validation/ItsValidateCommentTest.java b/src/test/java/com/googlesource/gerrit/plugins/its/base/validation/ItsValidateCommentTest.java
index e03b69f..433c43e 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/its/base/validation/ItsValidateCommentTest.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/its/base/validation/ItsValidateCommentTest.java
@@ -15,7 +15,11 @@
 
 import static com.google.common.truth.Truth.assertThat;
 import static com.google.gerrit.testing.GerritJUnit.assertThrows;
-import static org.easymock.EasyMock.expect;
+import static org.mockito.Mockito.atLeastOnce;
+import static org.mockito.Mockito.doThrow;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
 
 import com.google.gerrit.entities.Project;
 import com.google.gerrit.extensions.annotations.PluginName;
@@ -32,17 +36,14 @@
 import com.googlesource.gerrit.plugins.its.base.testutil.LoggingMockingTestCase;
 import com.googlesource.gerrit.plugins.its.base.util.IssueExtractor;
 import java.io.IOException;
+import java.util.Date;
 import java.util.List;
 import java.util.Optional;
+import java.util.Random;
 import java.util.regex.Pattern;
 import org.eclipse.jgit.revwalk.RevCommit;
 import org.eclipse.jgit.transport.ReceiveCommand;
-import org.junit.runner.RunWith;
-import org.powermock.core.classloader.annotations.PrepareForTest;
-import org.powermock.modules.junit4.PowerMockRunner;
 
-@RunWith(PowerMockRunner.class)
-@PrepareForTest({RevCommit.class})
 public class ItsValidateCommentTest extends LoggingMockingTestCase {
   private Injector injector;
   private IssueExtractor issueExtractor;
@@ -55,38 +56,29 @@
   public void testOptional() throws CommitValidationException {
     List<CommitValidationMessage> ret;
     ItsValidateComment ivc = injector.getInstance(ItsValidateComment.class);
-    ReceiveCommand command = createMock(ReceiveCommand.class);
-    RevCommit commit = createMock(RevCommit.class);
+    ReceiveCommand command = mock(ReceiveCommand.class);
+    RevCommit commit = createCommit();
     CommitReceivedEvent event = newCommitReceivedEvent(command, project, null, commit, null);
 
-    expect(itsConfig.getItsAssociationPolicy())
-        .andReturn(ItsAssociationPolicy.OPTIONAL)
-        .atLeastOnce();
-
-    replayMocks();
+    when(itsConfig.getItsAssociationPolicy()).thenReturn(ItsAssociationPolicy.OPTIONAL);
 
     ret = ivc.onCommitReceived(event);
 
     assertEmptyList(ret);
+
+    verifyOneOrMore(itsConfig).getItsAssociationPolicy();
   }
 
   public void testSuggestedNonMatching() throws CommitValidationException {
     List<CommitValidationMessage> ret;
     ItsValidateComment ivc = injector.getInstance(ItsValidateComment.class);
-    ReceiveCommand command = createMock(ReceiveCommand.class);
-    RevCommit commit = createMock(RevCommit.class);
+    ReceiveCommand command = mock(ReceiveCommand.class);
+    RevCommit commit = createCommit("TestMessage");
     CommitReceivedEvent event = newCommitReceivedEvent(command, project, null, commit, null);
 
-    expect(itsConfig.getItsAssociationPolicy())
-        .andReturn(ItsAssociationPolicy.SUGGESTED)
-        .atLeastOnce();
-    expect(itsConfig.getDummyIssuePattern()).andReturn(Optional.empty()).atLeastOnce();
-    expect(commit.getFullMessage()).andReturn("TestMessage").atLeastOnce();
-    expect(commit.getId()).andReturn(commit).anyTimes();
-    expect(commit.getName()).andReturn("TestCommit").anyTimes();
-    expect(issueExtractor.getIssueIds("TestMessage")).andReturn(new String[] {}).atLeastOnce();
-
-    replayMocks();
+    when(itsConfig.getItsAssociationPolicy()).thenReturn(ItsAssociationPolicy.SUGGESTED);
+    when(itsConfig.getDummyIssuePattern()).thenReturn(Optional.empty());
+    when(issueExtractor.getIssueIds("TestMessage")).thenReturn(new String[] {});
 
     ret = ivc.onCommitReceived(event);
 
@@ -94,121 +86,104 @@
     assertTrue(
         "First CommitValidationMessages does not contain 'Missing " + "issue'",
         ret.get(0).getMessage().contains("Missing issue"));
+
+    verifyOneOrMore(itsConfig).getItsAssociationPolicy();
+    verifyOneOrMore(itsConfig).getDummyIssuePattern();
+    verifyOneOrMore(issueExtractor).getIssueIds("TestMessage");
   }
 
   public void testMandatoryNonMatching() {
     ItsValidateComment ivc = injector.getInstance(ItsValidateComment.class);
-    ReceiveCommand command = createMock(ReceiveCommand.class);
-    RevCommit commit = createMock(RevCommit.class);
+    ReceiveCommand command = mock(ReceiveCommand.class);
+    RevCommit commit = createCommit("TestMessage");
     CommitReceivedEvent event = newCommitReceivedEvent(command, project, null, commit, null);
 
-    expect(itsConfig.getItsAssociationPolicy())
-        .andReturn(ItsAssociationPolicy.MANDATORY)
-        .atLeastOnce();
-    expect(itsConfig.getDummyIssuePattern()).andReturn(Optional.empty()).atLeastOnce();
-    expect(commit.getFullMessage()).andReturn("TestMessage").atLeastOnce();
-    expect(commit.getId()).andReturn(commit).anyTimes();
-    expect(commit.getName()).andReturn("TestCommit").anyTimes();
-    expect(issueExtractor.getIssueIds("TestMessage")).andReturn(new String[] {}).atLeastOnce();
-
-    replayMocks();
+    when(itsConfig.getItsAssociationPolicy()).thenReturn(ItsAssociationPolicy.MANDATORY);
+    when(itsConfig.getDummyIssuePattern()).thenReturn(Optional.empty());
+    when(issueExtractor.getIssueIds("TestMessage")).thenReturn(new String[] {});
 
     CommitValidationException thrown =
         assertThrows(CommitValidationException.class, () -> ivc.onCommitReceived(event));
     assertThat(thrown).hasMessageThat().contains("Missing issue");
+
+    verifyOneOrMore(itsConfig).getItsAssociationPolicy();
+    verifyOneOrMore(itsConfig).getDummyIssuePattern();
+    verifyOneOrMore(issueExtractor).getIssueIds("TestMessage");
   }
 
   public void testOnlySkipMatching() throws CommitValidationException {
     List<CommitValidationMessage> ret;
     ItsValidateComment ivc = injector.getInstance(ItsValidateComment.class);
-    ReceiveCommand command = createMock(ReceiveCommand.class);
-    RevCommit commit = createMock(RevCommit.class);
+    ReceiveCommand command = mock(ReceiveCommand.class);
+    RevCommit commit = createCommit("TestMessage SKIP");
     CommitReceivedEvent event = newCommitReceivedEvent(command, project, null, commit, null);
 
-    expect(itsConfig.getItsAssociationPolicy())
-        .andReturn(ItsAssociationPolicy.MANDATORY)
-        .atLeastOnce();
-    expect(itsConfig.getDummyIssuePattern())
-        .andReturn(Optional.of(Pattern.compile("SKIP")))
-        .atLeastOnce();
-    expect(commit.getFullMessage()).andReturn("TestMessage SKIP").atLeastOnce();
-    expect(commit.getId()).andReturn(commit).anyTimes();
-    expect(commit.getName()).andReturn("TestCommit").anyTimes();
-    expect(issueExtractor.getIssueIds("TestMessage SKIP")).andReturn(new String[] {}).atLeastOnce();
-
-    replayMocks();
+    when(itsConfig.getItsAssociationPolicy()).thenReturn(ItsAssociationPolicy.MANDATORY);
+    when(itsConfig.getDummyIssuePattern()).thenReturn(Optional.of(Pattern.compile("SKIP")));
+    when(issueExtractor.getIssueIds("TestMessage SKIP")).thenReturn(new String[] {});
 
     ret = ivc.onCommitReceived(event);
 
     assertEmptyList(ret);
+
+    verifyOneOrMore(itsConfig).getItsAssociationPolicy();
+    verifyOneOrMore(itsConfig).getDummyIssuePattern();
+    verifyOneOrMore(issueExtractor).getIssueIds("TestMessage SKIP");
   }
 
   public void testSuggestedMatchingSingleExisting() throws CommitValidationException, IOException {
     List<CommitValidationMessage> ret;
     ItsValidateComment ivc = injector.getInstance(ItsValidateComment.class);
-    ReceiveCommand command = createMock(ReceiveCommand.class);
-    RevCommit commit = createMock(RevCommit.class);
+    ReceiveCommand command = mock(ReceiveCommand.class);
+    RevCommit commit = createCommit("bug#4711");
     CommitReceivedEvent event = newCommitReceivedEvent(command, project, null, commit, null);
-    expect(itsConfig.getItsAssociationPolicy())
-        .andReturn(ItsAssociationPolicy.SUGGESTED)
-        .atLeastOnce();
-    expect(commit.getFullMessage()).andReturn("bug#4711").atLeastOnce();
-    expect(commit.getId()).andReturn(commit).anyTimes();
-    expect(commit.getName()).andReturn("TestCommit").anyTimes();
-    expect(issueExtractor.getIssueIds("bug#4711")).andReturn(new String[] {"4711"}).atLeastOnce();
-    expect(itsFacadeFactory.getFacade(project.getNameKey())).andReturn(itsFacade);
-    expect(itsFacade.exists("4711")).andReturn(true).atLeastOnce();
-
-    replayMocks();
+    when(itsConfig.getItsAssociationPolicy()).thenReturn(ItsAssociationPolicy.SUGGESTED);
+    when(issueExtractor.getIssueIds("bug#4711")).thenReturn(new String[] {"4711"});
+    when(itsFacadeFactory.getFacade(project.getNameKey())).thenReturn(itsFacade);
+    when(itsFacade.exists("4711")).thenReturn(true);
 
     ret = ivc.onCommitReceived(event);
 
     assertEmptyList(ret);
+
+    verifyOneOrMore(itsConfig).getItsAssociationPolicy();
+    verifyOneOrMore(issueExtractor).getIssueIds("bug#4711");
+    verifyOneOrMore(itsFacade).exists("4711");
   }
 
   public void testMandatoryMatchingSingleExisting() throws CommitValidationException, IOException {
     List<CommitValidationMessage> ret;
     ItsValidateComment ivc = injector.getInstance(ItsValidateComment.class);
-    ReceiveCommand command = createMock(ReceiveCommand.class);
-    RevCommit commit = createMock(RevCommit.class);
+    ReceiveCommand command = mock(ReceiveCommand.class);
+    RevCommit commit = createCommit("bug#4711");
     CommitReceivedEvent event = newCommitReceivedEvent(command, project, null, commit, null);
 
-    expect(itsConfig.getItsAssociationPolicy())
-        .andReturn(ItsAssociationPolicy.MANDATORY)
-        .atLeastOnce();
-    expect(commit.getFullMessage()).andReturn("bug#4711").atLeastOnce();
-    expect(commit.getId()).andReturn(commit).anyTimes();
-    expect(commit.getName()).andReturn("TestCommit").anyTimes();
-    expect(issueExtractor.getIssueIds("bug#4711")).andReturn(new String[] {"4711"}).atLeastOnce();
-    expect(itsFacadeFactory.getFacade(project.getNameKey())).andReturn(itsFacade);
-    expect(itsFacade.exists("4711")).andReturn(true).atLeastOnce();
-
-    replayMocks();
+    when(itsConfig.getItsAssociationPolicy()).thenReturn(ItsAssociationPolicy.MANDATORY);
+    when(issueExtractor.getIssueIds("bug#4711")).thenReturn(new String[] {"4711"});
+    when(itsFacadeFactory.getFacade(project.getNameKey())).thenReturn(itsFacade);
+    when(itsFacade.exists("4711")).thenReturn(true);
 
     ret = ivc.onCommitReceived(event);
 
     assertEmptyList(ret);
+
+    verifyOneOrMore(itsConfig).getItsAssociationPolicy();
+    verifyOneOrMore(issueExtractor).getIssueIds("bug#4711");
+    verifyOneOrMore(itsFacade).exists("4711");
   }
 
   public void testSuggestedMatchingSingleNonExisting()
       throws CommitValidationException, IOException {
     List<CommitValidationMessage> ret;
     ItsValidateComment ivc = injector.getInstance(ItsValidateComment.class);
-    ReceiveCommand command = createMock(ReceiveCommand.class);
-    RevCommit commit = createMock(RevCommit.class);
+    ReceiveCommand command = mock(ReceiveCommand.class);
+    RevCommit commit = createCommit("bug#4711");
     CommitReceivedEvent event = newCommitReceivedEvent(command, project, null, commit, null);
 
-    expect(itsConfig.getItsAssociationPolicy())
-        .andReturn(ItsAssociationPolicy.SUGGESTED)
-        .atLeastOnce();
-    expect(commit.getFullMessage()).andReturn("bug#4711").atLeastOnce();
-    expect(commit.getId()).andReturn(commit).anyTimes();
-    expect(commit.getName()).andReturn("TestCommit").anyTimes();
-    expect(issueExtractor.getIssueIds("bug#4711")).andReturn(new String[] {"4711"}).atLeastOnce();
-    expect(itsFacadeFactory.getFacade(project.getNameKey())).andReturn(itsFacade);
-    expect(itsFacade.exists("4711")).andReturn(false).atLeastOnce();
-
-    replayMocks();
+    when(itsConfig.getItsAssociationPolicy()).thenReturn(ItsAssociationPolicy.SUGGESTED);
+    when(issueExtractor.getIssueIds("bug#4711")).thenReturn(new String[] {"4711"});
+    when(itsFacadeFactory.getFacade(project.getNameKey())).thenReturn(itsFacade);
+    when(itsFacade.exists("4711")).thenReturn(false);
 
     ret = ivc.onCommitReceived(event);
 
@@ -219,106 +194,90 @@
     assertTrue(
         "First CommitValidationMessages does not contain '4711'",
         ret.get(0).getMessage().contains("4711"));
+
+    verifyOneOrMore(itsConfig).getItsAssociationPolicy();
+    verifyOneOrMore(issueExtractor).getIssueIds("bug#4711");
+    verifyOneOrMore(itsFacade).exists("4711");
   }
 
   public void testMandatoryMatchingSingleNonExisting() throws IOException {
     ItsValidateComment ivc = injector.getInstance(ItsValidateComment.class);
-    ReceiveCommand command = createMock(ReceiveCommand.class);
-    RevCommit commit = createMock(RevCommit.class);
+    ReceiveCommand command = mock(ReceiveCommand.class);
+    RevCommit commit = createCommit("bug#4711");
     CommitReceivedEvent event = newCommitReceivedEvent(command, project, null, commit, null);
 
-    expect(itsConfig.getItsAssociationPolicy())
-        .andReturn(ItsAssociationPolicy.MANDATORY)
-        .atLeastOnce();
-    expect(commit.getFullMessage()).andReturn("bug#4711").atLeastOnce();
-    expect(commit.getId()).andReturn(commit).anyTimes();
-    expect(commit.getName()).andReturn("TestCommit").anyTimes();
-    expect(issueExtractor.getIssueIds("bug#4711")).andReturn(new String[] {"4711"}).atLeastOnce();
-    expect(itsFacadeFactory.getFacade(project.getNameKey())).andReturn(itsFacade);
-    expect(itsFacade.exists("4711")).andReturn(false).atLeastOnce();
-
-    replayMocks();
+    when(itsConfig.getItsAssociationPolicy()).thenReturn(ItsAssociationPolicy.MANDATORY);
+    when(issueExtractor.getIssueIds("bug#4711")).thenReturn(new String[] {"4711"});
+    when(itsFacadeFactory.getFacade(project.getNameKey())).thenReturn(itsFacade);
+    when(itsFacade.exists("4711")).thenReturn(false);
 
     CommitValidationException thrown =
         assertThrows(CommitValidationException.class, () -> ivc.onCommitReceived(event));
     assertThat(thrown).hasMessageThat().contains("Non-existing");
+
+    verifyOneOrMore(itsConfig).getItsAssociationPolicy();
+    verifyOneOrMore(issueExtractor).getIssueIds("bug#4711");
+    verifyOneOrMore(itsFacade).exists("4711");
   }
 
   public void testSuggestedMatchingMultiple() throws CommitValidationException, IOException {
     List<CommitValidationMessage> ret;
     ItsValidateComment ivc = injector.getInstance(ItsValidateComment.class);
-    ReceiveCommand command = createMock(ReceiveCommand.class);
-    RevCommit commit = createMock(RevCommit.class);
+    ReceiveCommand command = mock(ReceiveCommand.class);
+    RevCommit commit = createCommit("bug#4711, bug#42");
     CommitReceivedEvent event = newCommitReceivedEvent(command, project, null, commit, null);
 
-    expect(itsConfig.getItsAssociationPolicy())
-        .andReturn(ItsAssociationPolicy.SUGGESTED)
-        .atLeastOnce();
-    expect(commit.getFullMessage()).andReturn("bug#4711, bug#42").atLeastOnce();
-    expect(commit.getId()).andReturn(commit).anyTimes();
-    expect(commit.getName()).andReturn("TestCommit").anyTimes();
-    expect(issueExtractor.getIssueIds("bug#4711, bug#42"))
-        .andReturn(new String[] {"4711", "42"})
-        .atLeastOnce();
-    expect(itsFacadeFactory.getFacade(project.getNameKey())).andReturn(itsFacade).anyTimes();
-    expect(itsFacade.exists("4711")).andReturn(true).atLeastOnce();
-    expect(itsFacade.exists("42")).andReturn(true).atLeastOnce();
-
-    replayMocks();
+    when(itsConfig.getItsAssociationPolicy()).thenReturn(ItsAssociationPolicy.SUGGESTED);
+    when(issueExtractor.getIssueIds("bug#4711, bug#42")).thenReturn(new String[] {"4711", "42"});
+    when(itsFacadeFactory.getFacade(project.getNameKey())).thenReturn(itsFacade);
+    when(itsFacade.exists("4711")).thenReturn(true);
+    when(itsFacade.exists("42")).thenReturn(true);
 
     ret = ivc.onCommitReceived(event);
 
     assertEmptyList(ret);
+
+    verifyOneOrMore(itsConfig).getItsAssociationPolicy();
+    verifyOneOrMore(itsFacade).exists("4711");
+    verifyOneOrMore(itsFacade).exists("42");
   }
 
   public void testMandatoryMatchingMultiple() throws CommitValidationException, IOException {
     List<CommitValidationMessage> ret;
     ItsValidateComment ivc = injector.getInstance(ItsValidateComment.class);
-    ReceiveCommand command = createMock(ReceiveCommand.class);
-    RevCommit commit = createMock(RevCommit.class);
+    ReceiveCommand command = mock(ReceiveCommand.class);
+    RevCommit commit = createCommit("bug#4711, bug#42");
     CommitReceivedEvent event = newCommitReceivedEvent(command, project, null, commit, null);
 
-    expect(itsConfig.getItsAssociationPolicy())
-        .andReturn(ItsAssociationPolicy.MANDATORY)
-        .atLeastOnce();
-    expect(commit.getFullMessage()).andReturn("bug#4711, bug#42").atLeastOnce();
-    expect(commit.getId()).andReturn(commit).anyTimes();
-    expect(commit.getName()).andReturn("TestCommit").anyTimes();
-    expect(issueExtractor.getIssueIds("bug#4711, bug#42"))
-        .andReturn(new String[] {"4711", "42"})
-        .atLeastOnce();
-    expect(itsFacadeFactory.getFacade(project.getNameKey())).andReturn(itsFacade).anyTimes();
-    expect(itsFacade.exists("4711")).andReturn(true).atLeastOnce();
-    expect(itsFacade.exists("42")).andReturn(true).atLeastOnce();
-
-    replayMocks();
+    when(itsConfig.getItsAssociationPolicy()).thenReturn(ItsAssociationPolicy.MANDATORY);
+    when(issueExtractor.getIssueIds("bug#4711, bug#42")).thenReturn(new String[] {"4711", "42"});
+    when(itsFacadeFactory.getFacade(project.getNameKey())).thenReturn(itsFacade);
+    when(itsFacade.exists("4711")).thenReturn(true);
+    when(itsFacade.exists("42")).thenReturn(true);
 
     ret = ivc.onCommitReceived(event);
 
     assertEmptyList(ret);
+
+    verifyOneOrMore(itsConfig).getItsAssociationPolicy();
+    verifyOneOrMore(issueExtractor).getIssueIds("bug#4711, bug#42");
+    verifyOneOrMore(itsFacade).exists("4711");
+    verifyOneOrMore(itsFacade).exists("42");
   }
 
   public void testSuggestedMatchingMultipleOneNonExsting()
       throws CommitValidationException, IOException {
     List<CommitValidationMessage> ret;
     ItsValidateComment ivc = injector.getInstance(ItsValidateComment.class);
-    ReceiveCommand command = createMock(ReceiveCommand.class);
-    RevCommit commit = createMock(RevCommit.class);
+    ReceiveCommand command = mock(ReceiveCommand.class);
+    RevCommit commit = createCommit("bug#4711, bug#42");
     CommitReceivedEvent event = newCommitReceivedEvent(command, project, null, commit, null);
 
-    expect(itsConfig.getItsAssociationPolicy())
-        .andReturn(ItsAssociationPolicy.SUGGESTED)
-        .atLeastOnce();
-    expect(commit.getFullMessage()).andReturn("bug#4711, bug#42").atLeastOnce();
-    expect(commit.getId()).andReturn(commit).anyTimes();
-    expect(commit.getName()).andReturn("TestCommit").anyTimes();
-    expect(issueExtractor.getIssueIds("bug#4711, bug#42"))
-        .andReturn(new String[] {"4711", "42"})
-        .atLeastOnce();
-    expect(itsFacadeFactory.getFacade(project.getNameKey())).andReturn(itsFacade).anyTimes();
-    expect(itsFacade.exists("4711")).andReturn(false).atLeastOnce();
-    expect(itsFacade.exists("42")).andReturn(true).atLeastOnce();
-    replayMocks();
+    when(itsConfig.getItsAssociationPolicy()).thenReturn(ItsAssociationPolicy.SUGGESTED);
+    when(issueExtractor.getIssueIds("bug#4711, bug#42")).thenReturn(new String[] {"4711", "42"});
+    when(itsFacadeFactory.getFacade(project.getNameKey())).thenReturn(itsFacade);
+    when(itsFacade.exists("4711")).thenReturn(false);
+    when(itsFacade.exists("42")).thenReturn(true);
 
     ret = ivc.onCommitReceived(event);
 
@@ -332,56 +291,48 @@
     assertFalse(
         "First CommitValidationMessages contains '42', although " + "that bug exists",
         ret.get(0).getMessage().contains("42"));
+
+    verifyOneOrMore(itsConfig).getItsAssociationPolicy();
+    verifyOneOrMore(issueExtractor).getIssueIds("bug#4711, bug#42");
+    verifyOneOrMore(itsFacade).exists("4711");
+    verifyOneOrMore(itsFacade).exists("42");
   }
 
   public void testMandatoryMatchingMultipleOneNonExsting() throws IOException {
     ItsValidateComment ivc = injector.getInstance(ItsValidateComment.class);
-    ReceiveCommand command = createMock(ReceiveCommand.class);
-    RevCommit commit = createMock(RevCommit.class);
+    ReceiveCommand command = mock(ReceiveCommand.class);
+    RevCommit commit = createCommit("bug#4711, bug#42");
     CommitReceivedEvent event = newCommitReceivedEvent(command, project, null, commit, null);
 
-    expect(itsConfig.getItsAssociationPolicy())
-        .andReturn(ItsAssociationPolicy.MANDATORY)
-        .atLeastOnce();
-    expect(commit.getFullMessage()).andReturn("bug#4711, bug#42").atLeastOnce();
-    expect(commit.getId()).andReturn(commit).anyTimes();
-    expect(commit.getName()).andReturn("TestCommit").anyTimes();
-    expect(issueExtractor.getIssueIds("bug#4711, bug#42"))
-        .andReturn(new String[] {"4711", "42"})
-        .atLeastOnce();
-    expect(itsFacadeFactory.getFacade(project.getNameKey())).andReturn(itsFacade).anyTimes();
-    expect(itsFacade.exists("4711")).andReturn(false).atLeastOnce();
-    expect(itsFacade.exists("42")).andReturn(true).atLeastOnce();
-
-    replayMocks();
+    when(itsConfig.getItsAssociationPolicy()).thenReturn(ItsAssociationPolicy.MANDATORY);
+    when(issueExtractor.getIssueIds("bug#4711, bug#42")).thenReturn(new String[] {"4711", "42"});
+    when(itsFacadeFactory.getFacade(project.getNameKey())).thenReturn(itsFacade);
+    when(itsFacade.exists("4711")).thenReturn(false);
+    when(itsFacade.exists("42")).thenReturn(true);
 
     CommitValidationException thrown =
         assertThrows(CommitValidationException.class, () -> ivc.onCommitReceived(event));
     assertThat(thrown).hasMessageThat().contains("Non-existing");
+
+    verifyOneOrMore(itsConfig).getItsAssociationPolicy();
+    verifyOneOrMore(issueExtractor).getIssueIds("bug#4711, bug#42");
+    verifyOneOrMore(itsFacade).exists("4711");
+    verifyOneOrMore(itsFacade).exists("42");
   }
 
   public void testSuggestedMatchingMultipleSomeNonExsting()
       throws CommitValidationException, IOException {
     List<CommitValidationMessage> ret;
     ItsValidateComment ivc = injector.getInstance(ItsValidateComment.class);
-    ReceiveCommand command = createMock(ReceiveCommand.class);
-    RevCommit commit = createMock(RevCommit.class);
+    ReceiveCommand command = mock(ReceiveCommand.class);
+    RevCommit commit = createCommit("bug#4711, bug#42");
     CommitReceivedEvent event = newCommitReceivedEvent(command, project, null, commit, null);
 
-    expect(itsConfig.getItsAssociationPolicy())
-        .andReturn(ItsAssociationPolicy.SUGGESTED)
-        .atLeastOnce();
-    expect(commit.getFullMessage()).andReturn("bug#4711, bug#42").atLeastOnce();
-    expect(commit.getId()).andReturn(commit).anyTimes();
-    expect(commit.getName()).andReturn("TestCommit").anyTimes();
-    expect(issueExtractor.getIssueIds("bug#4711, bug#42"))
-        .andReturn(new String[] {"4711", "42"})
-        .atLeastOnce();
-    expect(itsFacadeFactory.getFacade(project.getNameKey())).andReturn(itsFacade).anyTimes();
-    expect(itsFacade.exists("4711")).andReturn(false).atLeastOnce();
-    expect(itsFacade.exists("42")).andReturn(false).atLeastOnce();
-
-    replayMocks();
+    when(itsConfig.getItsAssociationPolicy()).thenReturn(ItsAssociationPolicy.SUGGESTED);
+    when(issueExtractor.getIssueIds("bug#4711, bug#42")).thenReturn(new String[] {"4711", "42"});
+    when(itsFacadeFactory.getFacade(project.getNameKey())).thenReturn(itsFacade);
+    when(itsFacade.exists("4711")).thenReturn(false);
+    when(itsFacade.exists("42")).thenReturn(false);
 
     ret = ivc.onCommitReceived(event);
 
@@ -395,56 +346,48 @@
     assertTrue(
         "First CommitValidationMessages does not contain '42'",
         ret.get(0).getMessage().contains("42"));
+
+    verifyOneOrMore(itsConfig).getItsAssociationPolicy();
+    verifyOneOrMore(issueExtractor).getIssueIds("bug#4711, bug#42");
+    verifyOneOrMore(itsFacade).exists("4711");
+    verifyOneOrMore(itsFacade).exists("42");
   }
 
   public void testMandatoryMatchingMultipleSomeNonExsting() throws IOException {
     ItsValidateComment ivc = injector.getInstance(ItsValidateComment.class);
-    ReceiveCommand command = createMock(ReceiveCommand.class);
-    RevCommit commit = createMock(RevCommit.class);
+    ReceiveCommand command = mock(ReceiveCommand.class);
+    RevCommit commit = createCommit("bug#4711, bug#42");
     CommitReceivedEvent event = newCommitReceivedEvent(command, project, null, commit, null);
 
-    expect(itsConfig.getItsAssociationPolicy())
-        .andReturn(ItsAssociationPolicy.MANDATORY)
-        .atLeastOnce();
-    expect(commit.getFullMessage()).andReturn("bug#4711, bug#42").atLeastOnce();
-    expect(commit.getId()).andReturn(commit).anyTimes();
-    expect(commit.getName()).andReturn("TestCommit").anyTimes();
-    expect(issueExtractor.getIssueIds("bug#4711, bug#42"))
-        .andReturn(new String[] {"4711", "42"})
-        .atLeastOnce();
-    expect(itsFacadeFactory.getFacade(project.getNameKey())).andReturn(itsFacade).anyTimes();
-    expect(itsFacade.exists("4711")).andReturn(false).atLeastOnce();
-    expect(itsFacade.exists("42")).andReturn(true).atLeastOnce();
-
-    replayMocks();
+    when(itsConfig.getItsAssociationPolicy()).thenReturn(ItsAssociationPolicy.MANDATORY);
+    when(issueExtractor.getIssueIds("bug#4711, bug#42")).thenReturn(new String[] {"4711", "42"});
+    when(itsFacadeFactory.getFacade(project.getNameKey())).thenReturn(itsFacade);
+    when(itsFacade.exists("4711")).thenReturn(false);
+    when(itsFacade.exists("42")).thenReturn(true);
 
     CommitValidationException thrown =
         assertThrows(CommitValidationException.class, () -> ivc.onCommitReceived(event));
     assertThat(thrown).hasMessageThat().contains("Non-existing");
+
+    verifyOneOrMore(itsConfig).getItsAssociationPolicy();
+    verifyOneOrMore(issueExtractor).getIssueIds("bug#4711, bug#42");
+    verifyOneOrMore(itsFacade).exists("4711");
+    verifyOneOrMore(itsFacade).exists("42");
   }
 
   public void testSuggestedMatchingMultipleIOExceptionIsNonExsting()
       throws CommitValidationException, IOException {
     List<CommitValidationMessage> ret;
     ItsValidateComment ivc = injector.getInstance(ItsValidateComment.class);
-    ReceiveCommand command = createMock(ReceiveCommand.class);
-    RevCommit commit = createMock(RevCommit.class);
+    ReceiveCommand command = mock(ReceiveCommand.class);
+    RevCommit commit = createCommit("bug#4711, bug#42");
     CommitReceivedEvent event = newCommitReceivedEvent(command, project, null, commit, null);
 
-    expect(itsConfig.getItsAssociationPolicy())
-        .andReturn(ItsAssociationPolicy.SUGGESTED)
-        .atLeastOnce();
-    expect(commit.getFullMessage()).andReturn("bug#4711, bug#42").atLeastOnce();
-    expect(commit.getId()).andReturn(commit).anyTimes();
-    expect(commit.getName()).andReturn("TestCommit").anyTimes();
-    expect(issueExtractor.getIssueIds("bug#4711, bug#42"))
-        .andReturn(new String[] {"4711", "42"})
-        .atLeastOnce();
-    expect(itsFacadeFactory.getFacade(project.getNameKey())).andReturn(itsFacade).anyTimes();
-    expect(itsFacade.exists("4711")).andThrow(new IOException("InjectedEx1")).atLeastOnce();
-    expect(itsFacade.exists("42")).andReturn(false).atLeastOnce();
-
-    replayMocks();
+    when(itsConfig.getItsAssociationPolicy()).thenReturn(ItsAssociationPolicy.SUGGESTED);
+    when(issueExtractor.getIssueIds("bug#4711, bug#42")).thenReturn(new String[] {"4711", "42"});
+    when(itsFacadeFactory.getFacade(project.getNameKey())).thenReturn(itsFacade);
+    doThrow(new IOException("InjectedEx1")).when(itsFacade).exists("4711");
+    when(itsFacade.exists("42")).thenReturn(false);
 
     ret = ivc.onCommitReceived(event);
 
@@ -470,27 +413,25 @@
         ret.get(1).getMessage().contains("42"));
 
     assertLogMessageContains("4711");
+
+    verifyOneOrMore(itsConfig).getItsAssociationPolicy();
+    verifyOneOrMore(issueExtractor).getIssueIds("bug#4711, bug#42");
+    verifyOneOrMore(itsFacade).exists("4711");
+    verifyOneOrMore(itsFacade).exists("42");
   }
 
   public void testMandatoryMatchingSingleIOException()
       throws CommitValidationException, IOException {
     List<CommitValidationMessage> ret;
     ItsValidateComment ivc = injector.getInstance(ItsValidateComment.class);
-    ReceiveCommand command = createMock(ReceiveCommand.class);
-    RevCommit commit = createMock(RevCommit.class);
+    ReceiveCommand command = mock(ReceiveCommand.class);
+    RevCommit commit = createCommit("bug#4711");
     CommitReceivedEvent event = newCommitReceivedEvent(command, project, null, commit, null);
 
-    expect(itsConfig.getItsAssociationPolicy())
-        .andReturn(ItsAssociationPolicy.MANDATORY)
-        .atLeastOnce();
-    expect(commit.getFullMessage()).andReturn("bug#4711").atLeastOnce();
-    expect(commit.getId()).andReturn(commit).anyTimes();
-    expect(commit.getName()).andReturn("TestCommit").anyTimes();
-    expect(issueExtractor.getIssueIds("bug#4711")).andReturn(new String[] {"4711"}).atLeastOnce();
-    expect(itsFacadeFactory.getFacade(project.getNameKey())).andReturn(itsFacade).anyTimes();
-    expect(itsFacade.exists("4711")).andThrow(new IOException("InjectedEx1")).atLeastOnce();
-
-    replayMocks();
+    when(itsConfig.getItsAssociationPolicy()).thenReturn(ItsAssociationPolicy.MANDATORY);
+    when(issueExtractor.getIssueIds("bug#4711")).thenReturn(new String[] {"4711"});
+    when(itsFacadeFactory.getFacade(project.getNameKey())).thenReturn(itsFacade);
+    doThrow(new IOException("InjectedEx1")).when(itsFacade).exists("4711");
 
     ret = ivc.onCommitReceived(event);
 
@@ -506,29 +447,23 @@
         ret.get(0).getMessage().contains("InjectedEx1"));
 
     assertLogMessageContains("4711");
+
+    verifyOneOrMore(itsConfig).getItsAssociationPolicy();
+    verifyOneOrMore(issueExtractor).getIssueIds("bug#4711");
+    verifyOneOrMore(itsFacade).exists("4711");
   }
 
   public void testMandatoryMatchingMultipleIOExceptionIsNonExisting() throws IOException {
-    List<CommitValidationMessage> ret;
     ItsValidateComment ivc = injector.getInstance(ItsValidateComment.class);
-    ReceiveCommand command = createMock(ReceiveCommand.class);
-    RevCommit commit = createMock(RevCommit.class);
+    ReceiveCommand command = mock(ReceiveCommand.class);
+    RevCommit commit = createCommit("bug#4711, bug#42");
     CommitReceivedEvent event = newCommitReceivedEvent(command, project, null, commit, null);
 
-    expect(itsConfig.getItsAssociationPolicy())
-        .andReturn(ItsAssociationPolicy.MANDATORY)
-        .atLeastOnce();
-    expect(commit.getFullMessage()).andReturn("bug#4711, bug#42").atLeastOnce();
-    expect(commit.getId()).andReturn(commit).anyTimes();
-    expect(commit.getName()).andReturn("TestCommit").anyTimes();
-    expect(issueExtractor.getIssueIds("bug#4711, bug#42"))
-        .andReturn(new String[] {"4711", "42"})
-        .atLeastOnce();
-    expect(itsFacadeFactory.getFacade(project.getNameKey())).andReturn(itsFacade).anyTimes();
-    expect(itsFacade.exists("4711")).andThrow(new IOException("InjectedEx1")).atLeastOnce();
-    expect(itsFacade.exists("42")).andReturn(false).atLeastOnce();
-
-    replayMocks();
+    when(itsConfig.getItsAssociationPolicy()).thenReturn(ItsAssociationPolicy.MANDATORY);
+    when(issueExtractor.getIssueIds("bug#4711, bug#42")).thenReturn(new String[] {"4711", "42"});
+    when(itsFacadeFactory.getFacade(project.getNameKey())).thenReturn(itsFacade);
+    doThrow(new IOException("InjectedEx1")).when(itsFacade).exists("4711");
+    when(itsFacade.exists("42")).thenReturn(false);
 
     try {
       ivc.onCommitReceived(event);
@@ -539,30 +474,26 @@
           "Message of thrown CommitValidationException does not " + "contain 'Non-existing'",
           e.getMessage().contains("Non-existing"));
     }
+
+    verifyOneOrMore(itsConfig).getItsAssociationPolicy();
+    verifyOneOrMore(issueExtractor).getIssueIds("bug#4711, bug#42");
+    verifyOneOrMore(itsFacade).exists("4711");
+    verifyOneOrMore(itsFacade).exists("42");
   }
 
   public void testMandatoryMatchingMultipleIOExceptionExisting()
       throws CommitValidationException, IOException {
     List<CommitValidationMessage> ret;
     ItsValidateComment ivc = injector.getInstance(ItsValidateComment.class);
-    ReceiveCommand command = createMock(ReceiveCommand.class);
-    RevCommit commit = createMock(RevCommit.class);
+    ReceiveCommand command = mock(ReceiveCommand.class);
+    RevCommit commit = createCommit("bug#4711, bug#42");
     CommitReceivedEvent event = newCommitReceivedEvent(command, project, null, commit, null);
 
-    expect(itsConfig.getItsAssociationPolicy())
-        .andReturn(ItsAssociationPolicy.MANDATORY)
-        .atLeastOnce();
-    expect(commit.getFullMessage()).andReturn("bug#4711, bug#42").atLeastOnce();
-    expect(commit.getId()).andReturn(commit).anyTimes();
-    expect(commit.getName()).andReturn("TestCommit").anyTimes();
-    expect(issueExtractor.getIssueIds("bug#4711, bug#42"))
-        .andReturn(new String[] {"4711", "42"})
-        .atLeastOnce();
-    expect(itsFacadeFactory.getFacade(project.getNameKey())).andReturn(itsFacade).anyTimes();
-    expect(itsFacade.exists("4711")).andThrow(new IOException("InjectedEx1")).atLeastOnce();
-    expect(itsFacade.exists("42")).andReturn(true).atLeastOnce();
-
-    replayMocks();
+    when(itsConfig.getItsAssociationPolicy()).thenReturn(ItsAssociationPolicy.MANDATORY);
+    when(issueExtractor.getIssueIds("bug#4711, bug#42")).thenReturn(new String[] {"4711", "42"});
+    when(itsFacadeFactory.getFacade(project.getNameKey())).thenReturn(itsFacade);
+    doThrow(new IOException("InjectedEx1")).when(itsFacade).exists("4711");
+    when(itsFacade.exists("42")).thenReturn(true);
 
     ret = ivc.onCommitReceived(event);
 
@@ -578,6 +509,11 @@
         ret.get(0).getMessage().contains("InjectedEx1"));
 
     assertLogMessageContains("4711");
+
+    verifyOneOrMore(itsConfig).getItsAssociationPolicy();
+    verifyOneOrMore(issueExtractor).getIssueIds("bug#4711, bug#42");
+    verifyOneOrMore(itsFacade).exists("4711");
+    verifyOneOrMore(itsFacade).exists("42");
   }
 
   public void assertEmptyList(List<CommitValidationMessage> list) {
@@ -593,9 +529,9 @@
   }
 
   private void setupCommonMocks() {
-    expect(itsConfig.getIssuePattern()).andReturn(Pattern.compile("bug#(\\d+)")).anyTimes();
+    when(itsConfig.getIssuePattern()).thenReturn(Pattern.compile("bug#(\\d+)"));
     Project.NameKey projectNK = Project.nameKey("myProject");
-    expect(itsConfig.isEnabled(projectNK, null)).andReturn(true).anyTimes();
+    when(itsConfig.isEnabled(projectNK, null)).thenReturn(true);
   }
 
   @Override
@@ -613,32 +549,56 @@
       String refName,
       RevCommit commit,
       IdentifiedUser user) {
-    CommitReceivedEvent event = createMock(CommitReceivedEvent.class);
+    CommitReceivedEvent event = mock(CommitReceivedEvent.class);
     event.command = command;
     event.project = project;
     event.refName = refName;
     event.commit = commit;
     event.user = user;
-    expect(event.getProjectNameKey()).andReturn(project.getNameKey()).anyTimes();
-    expect(event.getRefName()).andReturn(null).anyTimes();
+    when(event.getProjectNameKey()).thenReturn(project.getNameKey());
+    when(event.getRefName()).thenReturn(null);
     return event;
   }
 
+  private RevCommit createCommit() {
+    return createCommit("Hello world");
+  }
+
+  private RevCommit createCommit(String fullMessage) {
+    String parents = String.format("parent %040x\n", new java.util.Random().nextLong());
+    String commitData =
+        String.format(
+            "tree %040x\n"
+                + parents
+                + "author John Doe <john@doe.com> %d +0100\n"
+                + "committer John Doe <john@doe.com> %d +0100\n\n"
+                + "%s",
+            new Random().nextLong(),
+            new Date().getTime(),
+            new Date().getTime(),
+            fullMessage);
+    return RevCommit.parse(commitData.getBytes());
+  }
+
+  private <T> T verifyOneOrMore(T mock) {
+    return verify(mock, atLeastOnce());
+  }
+
   private class TestModule extends FactoryModule {
     @Override
     protected void configure() {
       bind(String.class).annotatedWith(PluginName.class).toInstance("ItsTestName");
 
-      issueExtractor = createMock(IssueExtractor.class);
+      issueExtractor = mock(IssueExtractor.class);
       bind(IssueExtractor.class).toInstance(issueExtractor);
 
-      itsFacade = createMock(ItsFacade.class);
+      itsFacade = mock(ItsFacade.class);
       bind(ItsFacade.class).toInstance(itsFacade);
 
-      itsConfig = createMock(ItsConfig.class);
+      itsConfig = mock(ItsConfig.class);
       bind(ItsConfig.class).toInstance(itsConfig);
 
-      itsFacadeFactory = createMock(ItsFacadeFactory.class);
+      itsFacadeFactory = mock(ItsFacadeFactory.class);
       bind(ItsFacadeFactory.class).toInstance(itsFacadeFactory);
     }
   }
diff --git a/src/test/java/com/googlesource/gerrit/plugins/its/base/workflow/ActionControllerTest.java b/src/test/java/com/googlesource/gerrit/plugins/its/base/workflow/ActionControllerTest.java
index bd32089..3653d26 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/its/base/workflow/ActionControllerTest.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/its/base/workflow/ActionControllerTest.java
@@ -13,8 +13,10 @@
 // limitations under the License.
 package com.googlesource.gerrit.plugins.its.base.workflow;
 
-import static org.easymock.EasyMock.anyObject;
-import static org.easymock.EasyMock.expect;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
@@ -44,14 +46,11 @@
   public void testNoPropertySets() {
     ActionController actionController = createActionController();
 
-    ChangeEvent event = createMock(ChangeEvent.class);
+    ChangeEvent event = mock(ChangeEvent.class);
 
     Set<Map<String, String>> propertySets = new HashSet<>();
-    expect(propertyExtractor.extractFrom(event))
-        .andReturn(new RefEventProperties(Collections.emptyMap(), propertySets))
-        .anyTimes();
-
-    replayMocks();
+    when(propertyExtractor.extractFrom(event))
+        .thenReturn(new RefEventProperties(Collections.emptyMap(), propertySets));
 
     actionController.onEvent(event);
   }
@@ -59,22 +58,22 @@
   public void testNoActionsOrNoIssues() {
     ActionController actionController = createActionController();
 
-    ChangeEvent event = createMock(ChangeEvent.class);
+    ChangeEvent event = mock(ChangeEvent.class);
 
     Set<Map<String, String>> propertySets = new HashSet<>();
     Map<String, String> properties = ImmutableMap.of("fake", "property");
     propertySets.add(properties);
 
-    expect(propertyExtractor.extractFrom(event))
-        .andReturn(new RefEventProperties(properties, propertySets))
-        .anyTimes();
+    when(propertyExtractor.extractFrom(event))
+        .thenReturn(new RefEventProperties(properties, propertySets));
 
     // When no issues are found in the commit message, the list of actions is empty
     // as there are no matchs with an empty map of properties.
     Collection<ActionRequest> actions = Collections.emptySet();
-    expect(ruleBase.actionRequestsFor(properties)).andReturn(actions).times(2);
-
-    replayMocks();
+    when(ruleBase.actionRequestsFor(properties))
+        .thenReturn(actions)
+        .thenReturn(actions)
+        .thenThrow(new UnsupportedOperationException("Method called more than twice"));
 
     actionController.onEvent(event);
   }
@@ -82,7 +81,7 @@
   public void testSinglePropertyMapSingleIssueActionSingleProjectAction() {
     ActionController actionController = createActionController();
 
-    ChangeEvent event = createMock(ChangeEvent.class);
+    ChangeEvent event = mock(ChangeEvent.class);
 
     Map<String, String> projectProperties = ImmutableMap.of("its-project", "itsProject");
 
@@ -94,56 +93,58 @@
 
     Set<Map<String, String>> propertySets = ImmutableSet.of(issueProperties);
 
-    expect(propertyExtractor.extractFrom(event))
-        .andReturn(new RefEventProperties(projectProperties, propertySets))
-        .anyTimes();
+    when(propertyExtractor.extractFrom(event))
+        .thenReturn(new RefEventProperties(projectProperties, propertySets));
 
-    ActionRequest issueActionRequest1 = createMock(ActionRequest.class);
+    ActionRequest issueActionRequest1 = mock(ActionRequest.class);
     Collection<ActionRequest> issueActionRequests = ImmutableList.of(issueActionRequest1);
-    expect(ruleBase.actionRequestsFor(issueProperties)).andReturn(issueActionRequests).once();
+    when(ruleBase.actionRequestsFor(issueProperties))
+        .thenReturn(issueActionRequests)
+        .thenThrow(new UnsupportedOperationException("Method called more than once"));
 
-    ActionRequest projectActionRequest1 = createMock(ActionRequest.class);
+    ActionRequest projectActionRequest1 = mock(ActionRequest.class);
     Collection<ActionRequest> projectActionRequests = ImmutableList.of(projectActionRequest1);
-    expect(ruleBase.actionRequestsFor(projectProperties)).andReturn(projectActionRequests).once();
-
-    actionExecutor.executeOnIssue(issueActionRequests, issueProperties);
-    actionExecutor.executeOnProject(projectActionRequests, projectProperties);
-
-    replayMocks();
+    when(ruleBase.actionRequestsFor(projectProperties))
+        .thenReturn(projectActionRequests)
+        .thenThrow(new UnsupportedOperationException("Method called more than once"));
 
     actionController.onEvent(event);
+
+    verify(actionExecutor).executeOnIssue(issueActionRequests, issueProperties);
+    verify(actionExecutor).executeOnProject(projectActionRequests, projectProperties);
   }
 
   public void testMultiplePropertyMapsMultipleActionMultipleIssue() {
     ActionController actionController = createActionController();
 
-    ChangeEvent event = createMock(ChangeEvent.class);
+    ChangeEvent event = mock(ChangeEvent.class);
 
     Map<String, String> properties1 = ImmutableMap.of("issue", "testIssue");
     Map<String, String> properties2 = ImmutableMap.of("issue", "testIssue2");
 
     Set<Map<String, String>> propertySets = ImmutableSet.of(properties1, properties2);
 
-    expect(propertyExtractor.extractFrom(event))
-        .andReturn(new RefEventProperties(Collections.emptyMap(), propertySets))
-        .anyTimes();
+    when(propertyExtractor.extractFrom(event))
+        .thenReturn(new RefEventProperties(Collections.emptyMap(), propertySets));
 
-    ActionRequest actionRequest1 = createMock(ActionRequest.class);
+    ActionRequest actionRequest1 = mock(ActionRequest.class);
     Collection<ActionRequest> actionRequests1 = ImmutableList.of(actionRequest1);
 
-    ActionRequest actionRequest2 = createMock(ActionRequest.class);
-    ActionRequest actionRequest3 = createMock(ActionRequest.class);
+    ActionRequest actionRequest2 = mock(ActionRequest.class);
+    ActionRequest actionRequest3 = mock(ActionRequest.class);
     Collection<ActionRequest> actionRequests2 = ImmutableList.of(actionRequest2, actionRequest3);
 
-    expect(ruleBase.actionRequestsFor(properties1)).andReturn(actionRequests1).once();
-    expect(ruleBase.actionRequestsFor(properties2)).andReturn(actionRequests2).once();
-
-    actionExecutor.executeOnIssue(actionRequests1, properties1);
-    actionExecutor.executeOnIssue(actionRequests2, properties2);
-
-    replayMocks();
+    when(ruleBase.actionRequestsFor(properties1))
+        .thenReturn(actionRequests1)
+        .thenThrow(new UnsupportedOperationException("Method called more than once"));
+    when(ruleBase.actionRequestsFor(properties2))
+        .thenReturn(actionRequests2)
+        .thenThrow(new UnsupportedOperationException("Method called more than once"));
 
     actionController.onEvent(event);
+
+    verify(actionExecutor).executeOnIssue(actionRequests1, properties1);
+    verify(actionExecutor).executeOnIssue(actionRequests2, properties2);
   }
 
   private ActionController createActionController() {
@@ -151,7 +152,7 @@
   }
 
   private void setupCommonMocks() {
-    expect(itsConfig.isEnabled(anyObject(RefEvent.class))).andReturn(true).anyTimes();
+    when(itsConfig.isEnabled(any(RefEvent.class))).thenReturn(true);
   }
 
   @Override
@@ -165,16 +166,16 @@
   private class TestModule extends FactoryModule {
     @Override
     protected void configure() {
-      propertyExtractor = createMock(PropertyExtractor.class);
+      propertyExtractor = mock(PropertyExtractor.class);
       bind(PropertyExtractor.class).toInstance(propertyExtractor);
 
-      ruleBase = createMock(RuleBase.class);
+      ruleBase = mock(RuleBase.class);
       bind(RuleBase.class).toInstance(ruleBase);
 
-      actionExecutor = createMock(ActionExecutor.class);
+      actionExecutor = mock(ActionExecutor.class);
       bind(ActionExecutor.class).toInstance(actionExecutor);
 
-      itsConfig = createMock(ItsConfig.class);
+      itsConfig = mock(ItsConfig.class);
       bind(ItsConfig.class).toInstance(itsConfig);
     }
   }
diff --git a/src/test/java/com/googlesource/gerrit/plugins/its/base/workflow/ActionExecutorTest.java b/src/test/java/com/googlesource/gerrit/plugins/its/base/workflow/ActionExecutorTest.java
index c5e6333..5b8c43f 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/its/base/workflow/ActionExecutorTest.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/its/base/workflow/ActionExecutorTest.java
@@ -13,8 +13,10 @@
 // limitations under the License.
 package com.googlesource.gerrit.plugins.its.base.workflow;
 
-import static org.easymock.EasyMock.expect;
-import static org.easymock.EasyMock.expectLastCall;
+import static org.mockito.Mockito.doThrow;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
 
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
@@ -57,33 +59,30 @@
           .build();
 
   public void testExecuteItem() throws IOException {
-    ActionRequest actionRequest = createMock(ActionRequest.class);
-    expect(actionRequest.getName()).andReturn("unparsed");
-    expect(actionRequest.getUnparsed()).andReturn("unparsed action 1");
-    expect(itsFacadeFactory.getFacade(Project.nameKey(properties.get("project")))).andReturn(its);
+    ActionRequest actionRequest = mock(ActionRequest.class);
+    when(actionRequest.getName()).thenReturn("unparsed");
+    when(actionRequest.getUnparsed()).thenReturn("unparsed action 1");
+    when(itsFacadeFactory.getFacade(Project.nameKey(properties.get("project")))).thenReturn(its);
 
     Set<ActionRequest> actionRequests = ImmutableSet.of(actionRequest);
 
-    its.performAction("4711", "unparsed action 1");
-
-    replayMocks();
-
     ActionExecutor actionExecutor = createActionExecutor();
     actionExecutor.executeOnIssue(actionRequests, properties);
+
+    verify(its).performAction("4711", "unparsed action 1");
   }
 
   public void testExecuteItemException() throws IOException {
-    ActionRequest actionRequest = createMock(ActionRequest.class);
-    expect(actionRequest.getName()).andReturn("unparsed");
-    expect(actionRequest.getUnparsed()).andReturn("unparsed action 1");
-    expect(itsFacadeFactory.getFacade(Project.nameKey(properties.get("project")))).andReturn(its);
+    ActionRequest actionRequest = mock(ActionRequest.class);
+    when(actionRequest.getName()).thenReturn("unparsed");
+    when(actionRequest.getUnparsed()).thenReturn("unparsed action 1");
+    when(itsFacadeFactory.getFacade(Project.nameKey(properties.get("project")))).thenReturn(its);
 
     Set<ActionRequest> actionRequests = ImmutableSet.of(actionRequest);
 
-    its.performAction("4711", "unparsed action 1");
-    expectLastCall().andThrow(new IOException("injected exception 1"));
-
-    replayMocks();
+    doThrow(new IOException("injected exception 1"))
+        .when(its)
+        .performAction("4711", "unparsed action 1");
 
     ActionExecutor actionExecutor = createActionExecutor();
     actionExecutor.executeOnIssue(actionRequests, properties);
@@ -92,201 +91,180 @@
   }
 
   public void testExecuteIterable() throws IOException {
-    ActionRequest actionRequest1 = createMock(ActionRequest.class);
-    expect(actionRequest1.getName()).andReturn("unparsed");
-    expect(actionRequest1.getUnparsed()).andReturn("unparsed action 1");
+    ActionRequest actionRequest1 = mock(ActionRequest.class);
+    when(actionRequest1.getName()).thenReturn("unparsed");
+    when(actionRequest1.getUnparsed()).thenReturn("unparsed action 1");
 
-    ActionRequest actionRequest2 = createMock(ActionRequest.class);
-    expect(actionRequest2.getName()).andReturn("unparsed");
-    expect(actionRequest2.getUnparsed()).andReturn("unparsed action 2");
-    expect(itsFacadeFactory.getFacade(Project.nameKey(properties.get("project"))))
-        .andReturn(its)
-        .anyTimes();
+    ActionRequest actionRequest2 = mock(ActionRequest.class);
+    when(actionRequest2.getName()).thenReturn("unparsed");
+    when(actionRequest2.getUnparsed()).thenReturn("unparsed action 2");
+    when(itsFacadeFactory.getFacade(Project.nameKey(properties.get("project")))).thenReturn(its);
 
     Set<ActionRequest> actionRequests = ImmutableSet.of(actionRequest1, actionRequest2);
 
-    its.performAction("4711", "unparsed action 1");
-    its.performAction("4711", "unparsed action 2");
-
-    replayMocks();
-
     ActionExecutor actionExecutor = createActionExecutor();
     actionExecutor.executeOnIssue(actionRequests, properties);
+
+    verify(its).performAction("4711", "unparsed action 1");
+    verify(its).performAction("4711", "unparsed action 2");
   }
 
   public void testExecuteIterableExceptions() throws IOException {
-    ActionRequest actionRequest1 = createMock(ActionRequest.class);
-    expect(actionRequest1.getName()).andReturn("unparsed");
-    expect(actionRequest1.getUnparsed()).andReturn("unparsed action 1");
+    ActionRequest actionRequest1 = mock(ActionRequest.class);
+    when(actionRequest1.getName()).thenReturn("unparsed");
+    when(actionRequest1.getUnparsed()).thenReturn("unparsed action 1");
 
-    ActionRequest actionRequest2 = createMock(ActionRequest.class);
-    expect(actionRequest2.getName()).andReturn("unparsed");
-    expect(actionRequest2.getUnparsed()).andReturn("unparsed action 2");
+    ActionRequest actionRequest2 = mock(ActionRequest.class);
+    when(actionRequest2.getName()).thenReturn("unparsed");
+    when(actionRequest2.getUnparsed()).thenReturn("unparsed action 2");
 
-    ActionRequest actionRequest3 = createMock(ActionRequest.class);
-    expect(actionRequest3.getName()).andReturn("unparsed");
-    expect(actionRequest3.getUnparsed()).andReturn("unparsed action 3");
-    expect(itsFacadeFactory.getFacade(Project.nameKey(properties.get("project"))))
-        .andReturn(its)
-        .anyTimes();
+    ActionRequest actionRequest3 = mock(ActionRequest.class);
+    when(actionRequest3.getName()).thenReturn("unparsed");
+    when(actionRequest3.getUnparsed()).thenReturn("unparsed action 3");
+    when(itsFacadeFactory.getFacade(Project.nameKey(properties.get("project")))).thenReturn(its);
 
     Set<ActionRequest> actionRequests =
         ImmutableSet.of(actionRequest1, actionRequest2, actionRequest3);
 
-    its.performAction("4711", "unparsed action 1");
-    expectLastCall().andThrow(new IOException("injected exception 1"));
-    its.performAction("4711", "unparsed action 2");
-    its.performAction("4711", "unparsed action 3");
-    expectLastCall().andThrow(new IOException("injected exception 3"));
-
-    replayMocks();
+    doThrow(new IOException("injected exception 1"))
+        .when(its)
+        .performAction("4711", "unparsed action 1");
+    doThrow(new IOException("injected exception 3"))
+        .when(its)
+        .performAction("4711", "unparsed action 3");
 
     ActionExecutor actionExecutor = createActionExecutor();
     actionExecutor.executeOnIssue(actionRequests, properties);
 
     assertLogThrowableMessageContains("injected exception 1");
     assertLogThrowableMessageContains("injected exception 3");
+
+    verify(its).performAction("4711", "unparsed action 2");
   }
 
   public void testAddCommentDelegation() throws IOException {
-    ActionRequest actionRequest = createMock(ActionRequest.class);
-    expect(actionRequest.getName()).andReturn("add-comment");
+    ActionRequest actionRequest = mock(ActionRequest.class);
+    when(actionRequest.getName()).thenReturn("add-comment");
 
     Set<ActionRequest> actionRequests = ImmutableSet.of(actionRequest);
 
-    AddComment addComment = createMock(AddComment.class);
-    expect(addCommentFactory.create()).andReturn(addComment);
-    expect(itsFacadeFactory.getFacade(Project.nameKey(properties.get("project")))).andReturn(its);
-
-    addComment.execute(its, "4711", actionRequest, properties);
-
-    replayMocks();
+    AddComment addComment = mock(AddComment.class);
+    when(addCommentFactory.create()).thenReturn(addComment);
+    when(itsFacadeFactory.getFacade(Project.nameKey(properties.get("project")))).thenReturn(its);
 
     ActionExecutor actionExecutor = createActionExecutor();
     actionExecutor.executeOnIssue(actionRequests, properties);
+
+    verify(addComment).execute(its, "4711", actionRequest, properties);
   }
 
   public void testAddSoyCommentDelegation() throws IOException {
-    ActionRequest actionRequest = createMock(ActionRequest.class);
-    expect(actionRequest.getName()).andReturn("add-soy-comment");
+    ActionRequest actionRequest = mock(ActionRequest.class);
+    when(actionRequest.getName()).thenReturn("add-soy-comment");
 
     Set<ActionRequest> actionRequests = ImmutableSet.of(actionRequest);
 
-    AddSoyComment addSoyComment = createMock(AddSoyComment.class);
-    expect(addSoyCommentFactory.create()).andReturn(addSoyComment);
-    expect(itsFacadeFactory.getFacade(Project.nameKey(properties.get("project")))).andReturn(its);
-
-    addSoyComment.execute(its, "4711", actionRequest, properties);
-
-    replayMocks();
+    AddSoyComment addSoyComment = mock(AddSoyComment.class);
+    when(addSoyCommentFactory.create()).thenReturn(addSoyComment);
+    when(itsFacadeFactory.getFacade(Project.nameKey(properties.get("project")))).thenReturn(its);
 
     ActionExecutor actionExecutor = createActionExecutor();
     actionExecutor.executeOnIssue(actionRequests, properties);
+
+    verify(addSoyComment).execute(its, "4711", actionRequest, properties);
   }
 
   public void testAddStandardCommentDelegation() throws IOException {
-    ActionRequest actionRequest = createMock(ActionRequest.class);
-    expect(actionRequest.getName()).andReturn("add-standard-comment");
+    ActionRequest actionRequest = mock(ActionRequest.class);
+    when(actionRequest.getName()).thenReturn("add-standard-comment");
 
     Set<ActionRequest> actionRequests = ImmutableSet.of(actionRequest);
 
-    AddStandardComment addStandardComment = createMock(AddStandardComment.class);
-    expect(addStandardCommentFactory.create()).andReturn(addStandardComment);
-    expect(itsFacadeFactory.getFacade(Project.nameKey(properties.get("project")))).andReturn(its);
-
-    addStandardComment.execute(its, "4711", actionRequest, properties);
-
-    replayMocks();
+    AddStandardComment addStandardComment = mock(AddStandardComment.class);
+    when(addStandardCommentFactory.create()).thenReturn(addStandardComment);
+    when(itsFacadeFactory.getFacade(Project.nameKey(properties.get("project")))).thenReturn(its);
 
     ActionExecutor actionExecutor = createActionExecutor();
     actionExecutor.executeOnIssue(actionRequests, properties);
+
+    verify(addStandardComment).execute(its, "4711", actionRequest, properties);
   }
 
   public void testLogEventDelegation() throws IOException {
-    ActionRequest actionRequest = createMock(ActionRequest.class);
-    expect(actionRequest.getName()).andReturn("log-event");
+    ActionRequest actionRequest = mock(ActionRequest.class);
+    when(actionRequest.getName()).thenReturn("log-event");
 
     Set<ActionRequest> actionRequests = ImmutableSet.of(actionRequest);
 
-    LogEvent logEvent = createMock(LogEvent.class);
-    expect(logEventFactory.create()).andReturn(logEvent);
-    expect(itsFacadeFactory.getFacade(Project.nameKey(properties.get("project")))).andReturn(its);
-
-    logEvent.execute(its, "4711", actionRequest, properties);
-
-    replayMocks();
+    LogEvent logEvent = mock(LogEvent.class);
+    when(logEventFactory.create()).thenReturn(logEvent);
+    when(itsFacadeFactory.getFacade(Project.nameKey(properties.get("project")))).thenReturn(its);
 
     ActionExecutor actionExecutor = createActionExecutor();
     actionExecutor.executeOnIssue(actionRequests, properties);
+
+    verify(logEvent).execute(its, "4711", actionRequest, properties);
   }
 
   public void testCreateVersionFromPropertyDelegation() throws IOException {
-    ActionRequest actionRequest = createMock(ActionRequest.class);
-    expect(actionRequest.getName()).andReturn("create-version-from-property");
+    ActionRequest actionRequest = mock(ActionRequest.class);
+    when(actionRequest.getName()).thenReturn("create-version-from-property");
 
-    CreateVersionFromProperty createVersionFromProperty =
-        createMock(CreateVersionFromProperty.class);
-    expect(createVersionFromPropertyFactory.create()).andReturn(createVersionFromProperty);
-    expect(itsFacadeFactory.getFacade(Project.nameKey(properties.get("project")))).andReturn(its);
-
-    createVersionFromProperty.execute(its, "itsTestProject", actionRequest, projectProperties);
-
-    replayMocks();
+    CreateVersionFromProperty createVersionFromProperty = mock(CreateVersionFromProperty.class);
+    when(createVersionFromPropertyFactory.create()).thenReturn(createVersionFromProperty);
+    when(itsFacadeFactory.getFacade(Project.nameKey(properties.get("project")))).thenReturn(its);
 
     ActionExecutor actionExecutor = createActionExecutor();
     actionExecutor.executeOnProject(Collections.singleton(actionRequest), projectProperties);
+
+    verify(createVersionFromProperty)
+        .execute(its, "itsTestProject", actionRequest, projectProperties);
   }
 
   public void testAddPropertyToFieldDelegation() throws IOException {
-    ActionRequest actionRequest = createMock(ActionRequest.class);
-    expect(actionRequest.getName()).andReturn("add-property-to-field");
+    ActionRequest actionRequest = mock(ActionRequest.class);
+    when(actionRequest.getName()).thenReturn("add-property-to-field");
 
     Set<ActionRequest> actionRequests = ImmutableSet.of(actionRequest);
 
-    AddPropertyToField addPropertyToField = createMock(AddPropertyToField.class);
-    expect(addPropertyToFieldFactory.create()).andReturn(addPropertyToField);
-    expect(itsFacadeFactory.getFacade(Project.nameKey(properties.get("project")))).andReturn(its);
-
-    addPropertyToField.execute(its, "4711", actionRequest, properties);
-
-    replayMocks();
+    AddPropertyToField addPropertyToField = mock(AddPropertyToField.class);
+    when(addPropertyToFieldFactory.create()).thenReturn(addPropertyToField);
+    when(itsFacadeFactory.getFacade(Project.nameKey(properties.get("project")))).thenReturn(its);
 
     ActionExecutor actionExecutor = createActionExecutor();
     actionExecutor.executeOnIssue(actionRequests, properties);
+
+    verify(addPropertyToField).execute(its, "4711", actionRequest, properties);
   }
 
   public void testExecuteIssueCustomAction() throws IOException {
-    expect(customAction.getType()).andReturn(ActionType.ISSUE);
+    when(customAction.getType()).thenReturn(ActionType.ISSUE);
 
-    ActionRequest actionRequest = createMock(ActionRequest.class);
-    expect(actionRequest.getName()).andReturn(CUSTOM_ACTION_NAME);
-    expect(itsFacadeFactory.getFacade(Project.nameKey(properties.get("project")))).andReturn(its);
+    ActionRequest actionRequest = mock(ActionRequest.class);
+    when(actionRequest.getName()).thenReturn(CUSTOM_ACTION_NAME);
+    when(itsFacadeFactory.getFacade(Project.nameKey(properties.get("project")))).thenReturn(its);
 
     Set<ActionRequest> actionRequests = ImmutableSet.of(actionRequest);
 
-    customAction.execute(its, "4711", actionRequest, properties);
-
-    replayMocks();
-
     ActionExecutor actionExecutor = createActionExecutor();
     actionExecutor.executeOnIssue(actionRequests, properties);
+
+    verify(customAction).execute(its, "4711", actionRequest, properties);
   }
 
   public void testExecuteProjectCustomAction() throws IOException {
-    expect(customAction.getType()).andReturn(ActionType.PROJECT);
+    when(customAction.getType()).thenReturn(ActionType.PROJECT);
 
-    ActionRequest actionRequest = createMock(ActionRequest.class);
-    expect(actionRequest.getName()).andReturn(CUSTOM_ACTION_NAME);
-    expect(itsFacadeFactory.getFacade(Project.nameKey(properties.get("project")))).andReturn(its);
+    ActionRequest actionRequest = mock(ActionRequest.class);
+    when(actionRequest.getName()).thenReturn(CUSTOM_ACTION_NAME);
+    when(itsFacadeFactory.getFacade(Project.nameKey(properties.get("project")))).thenReturn(its);
 
     Set<ActionRequest> actionRequests = ImmutableSet.of(actionRequest);
 
-    customAction.execute(its, "itsTestProject", actionRequest, projectProperties);
-
-    replayMocks();
-
     ActionExecutor actionExecutor = createActionExecutor();
     actionExecutor.executeOnProject(actionRequests, projectProperties);
+
+    verify(customAction).execute(its, "itsTestProject", actionRequest, projectProperties);
   }
 
   private ActionExecutor createActionExecutor() {
@@ -302,32 +280,32 @@
   private class TestModule extends FactoryModule {
     @Override
     protected void configure() {
-      its = createMock(ItsFacade.class);
+      its = mock(ItsFacade.class);
       bind(ItsFacade.class).toInstance(its);
 
-      addCommentFactory = createMock(AddComment.Factory.class);
+      addCommentFactory = mock(AddComment.Factory.class);
       bind(AddComment.Factory.class).toInstance(addCommentFactory);
 
-      addSoyCommentFactory = createMock(AddSoyComment.Factory.class);
+      addSoyCommentFactory = mock(AddSoyComment.Factory.class);
       bind(AddSoyComment.Factory.class).toInstance(addSoyCommentFactory);
 
-      addStandardCommentFactory = createMock(AddStandardComment.Factory.class);
+      addStandardCommentFactory = mock(AddStandardComment.Factory.class);
       bind(AddStandardComment.Factory.class).toInstance(addStandardCommentFactory);
 
-      logEventFactory = createMock(LogEvent.Factory.class);
+      logEventFactory = mock(LogEvent.Factory.class);
       bind(LogEvent.Factory.class).toInstance(logEventFactory);
 
-      itsFacadeFactory = createMock(ItsFacadeFactory.class);
+      itsFacadeFactory = mock(ItsFacadeFactory.class);
       bind(ItsFacadeFactory.class).toInstance(itsFacadeFactory);
 
-      addPropertyToFieldFactory = createMock(AddPropertyToField.Factory.class);
+      addPropertyToFieldFactory = mock(AddPropertyToField.Factory.class);
       bind(AddPropertyToField.Factory.class).toInstance(addPropertyToFieldFactory);
 
-      createVersionFromPropertyFactory = createMock(CreateVersionFromProperty.Factory.class);
+      createVersionFromPropertyFactory = mock(CreateVersionFromProperty.Factory.class);
       bind(CreateVersionFromProperty.Factory.class).toInstance(createVersionFromPropertyFactory);
 
       DynamicMap.mapOf(binder(), CustomAction.class);
-      customAction = createMock(CustomAction.class);
+      customAction = mock(CustomAction.class);
 
       bind(CustomAction.class)
           .annotatedWith(Exports.named(CUSTOM_ACTION_NAME))
diff --git a/src/test/java/com/googlesource/gerrit/plugins/its/base/workflow/ActionRequestTest.java b/src/test/java/com/googlesource/gerrit/plugins/its/base/workflow/ActionRequestTest.java
index e6de999..ac927f4 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/its/base/workflow/ActionRequestTest.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/its/base/workflow/ActionRequestTest.java
@@ -23,135 +23,97 @@
   private Injector injector;
 
   public void testUnparsedParameterless() {
-    replayMocks();
-
     ActionRequest actionRequest = createActionRequest("action");
     assertEquals("Unparsed string does not match", "action", actionRequest.getUnparsed());
   }
 
   public void testUnparsedNull() {
-    replayMocks();
-
     ActionRequest actionRequest = createActionRequest(null);
     assertEquals("Unparsed string does not match", "", actionRequest.getUnparsed());
   }
 
   public void testUnparsedSingleParameter() {
-    replayMocks();
-
     ActionRequest actionRequest = createActionRequest("action param");
     assertEquals("Unparsed string does not match", "action param", actionRequest.getUnparsed());
   }
 
   public void testUnparsedMultipleParameters() {
-    replayMocks();
-
     ActionRequest actionRequest = createActionRequest("action param1 param2");
     assertEquals(
         "Unparsed string does not match", "action param1 param2", actionRequest.getUnparsed());
   }
 
   public void testNameParameterless() {
-    replayMocks();
-
     ActionRequest actionRequest = createActionRequest("action");
     assertEquals("Unparsed string does not match", "action", actionRequest.getName());
   }
 
   public void testNameSingleParameter() {
-    replayMocks();
-
     ActionRequest actionRequest = createActionRequest("action param");
     assertEquals("Unparsed string does not match", "action", actionRequest.getName());
   }
 
   public void testNameMultipleParameters() {
-    replayMocks();
-
     ActionRequest actionRequest = createActionRequest("action param1 param2");
     assertEquals("Unparsed string does not match", "action", actionRequest.getName());
   }
 
   public void testNameNull() {
-    replayMocks();
-
     ActionRequest actionRequest = createActionRequest(null);
     assertEquals("Unparsed string does not match", "", actionRequest.getName());
   }
 
   public void testParameter1Parameterless() {
-    replayMocks();
-
     ActionRequest actionRequest = createActionRequest("action");
     assertEquals("Unparsed string does not match", "", actionRequest.getParameter(1));
   }
 
   public void testParameter1Null() {
-    replayMocks();
-
     ActionRequest actionRequest = createActionRequest(null);
     assertEquals("Unparsed string does not match", "", actionRequest.getParameter(1));
   }
 
   public void testParameter1SingleParameter() {
-    replayMocks();
-
     ActionRequest actionRequest = createActionRequest("action param");
     assertEquals("Unparsed string does not match", "param", actionRequest.getParameter(1));
   }
 
   public void testParemeter1MultipleParameters() {
-    replayMocks();
-
     ActionRequest actionRequest = createActionRequest("action param1 param2");
     assertEquals("Unparsed string does not match", "param1", actionRequest.getParameter(1));
   }
 
   public void testParameter3Parameterless() {
-    replayMocks();
-
     ActionRequest actionRequest = createActionRequest("action");
     assertEquals("Unparsed string does not match", "", actionRequest.getParameter(3));
   }
 
   public void testParameter3Null() {
-    replayMocks();
-
     ActionRequest actionRequest = createActionRequest(null);
     assertEquals("Unparsed string does not match", "", actionRequest.getParameter(3));
   }
 
   public void testParameter3SingleParameter() {
-    replayMocks();
-
     ActionRequest actionRequest = createActionRequest("action param");
     assertEquals("Unparsed string does not match", "", actionRequest.getParameter(3));
   }
 
   public void testParemeter3With2Parameters() {
-    replayMocks();
-
     ActionRequest actionRequest = createActionRequest("action param1 param2");
     assertEquals("Unparsed string does not match", "", actionRequest.getParameter(3));
   }
 
   public void testParemeter3With3Parameters() {
-    replayMocks();
-
     ActionRequest actionRequest = createActionRequest("action param1 param2 " + "param3");
     assertEquals("Unparsed string does not match", "param3", actionRequest.getParameter(3));
   }
 
   public void testParemeter3With4Parameters() {
-    replayMocks();
-
     ActionRequest actionRequest = createActionRequest("action param1 param2 " + "param3 param4");
     assertEquals("Unparsed string does not match", "param3", actionRequest.getParameter(3));
   }
 
   public void testParametersParameterless() {
-    replayMocks();
-
     ActionRequest actionRequest = createActionRequest("action");
 
     String[] expected = new String[0];
@@ -162,8 +124,6 @@
   }
 
   public void testParametersNull() {
-    replayMocks();
-
     ActionRequest actionRequest = createActionRequest(null);
 
     String[] expected = new String[0];
@@ -174,8 +134,6 @@
   }
 
   public void testParametersSingleParameter() {
-    replayMocks();
-
     ActionRequest actionRequest = createActionRequest("action param");
 
     String[] expected = new String[] {"param"};
@@ -186,8 +144,6 @@
   }
 
   public void testParameters3Parameter() {
-    replayMocks();
-
     ActionRequest actionRequest = createActionRequest("action param1 param2 " + "param3");
 
     String[] expected = new String[] {"param1", "param2", "param3"};
diff --git a/src/test/java/com/googlesource/gerrit/plugins/its/base/workflow/AddCommentTest.java b/src/test/java/com/googlesource/gerrit/plugins/its/base/workflow/AddCommentTest.java
index 149dfca..87fc762 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/its/base/workflow/AddCommentTest.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/its/base/workflow/AddCommentTest.java
@@ -13,7 +13,9 @@
 // limitations under the License.
 package com.googlesource.gerrit.plugins.its.base.workflow;
 
-import static org.easymock.EasyMock.expect;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
 
 import com.google.common.collect.ImmutableMap;
 import com.google.gerrit.extensions.config.FactoryModule;
@@ -29,25 +31,21 @@
   private ItsFacade its;
 
   public void testEmpty() throws IOException {
-    ActionRequest actionRequest = createMock(ActionRequest.class);
-    expect(actionRequest.getParameters()).andReturn(new String[] {});
-
-    replayMocks();
+    ActionRequest actionRequest = mock(ActionRequest.class);
+    when(actionRequest.getParameters()).thenReturn(new String[] {});
 
     AddComment addComment = createAddComment();
     addComment.execute(null, "4711", actionRequest, ImmutableMap.of());
   }
 
   public void testPlain() throws IOException {
-    ActionRequest actionRequest = createMock(ActionRequest.class);
-    expect(actionRequest.getParameters()).andReturn(new String[] {"Some", "test", "comment"});
-
-    its.addComment("4711", "Some test comment");
-
-    replayMocks();
+    ActionRequest actionRequest = mock(ActionRequest.class);
+    when(actionRequest.getParameters()).thenReturn(new String[] {"Some", "test", "comment"});
 
     AddComment addComment = createAddComment();
     addComment.execute(its, "4711", actionRequest, ImmutableMap.of());
+
+    verify(its).addComment("4711", "Some test comment");
   }
 
   private AddComment createAddComment() {
@@ -63,7 +61,7 @@
   private class TestModule extends FactoryModule {
     @Override
     protected void configure() {
-      its = createMock(ItsFacade.class);
+      its = mock(ItsFacade.class);
       bind(ItsFacade.class).toInstance(its);
     }
   }
diff --git a/src/test/java/com/googlesource/gerrit/plugins/its/base/workflow/AddPropertyToFieldParametersExtractorTest.java b/src/test/java/com/googlesource/gerrit/plugins/its/base/workflow/AddPropertyToFieldParametersExtractorTest.java
index b95f5ef..a760936 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/its/base/workflow/AddPropertyToFieldParametersExtractorTest.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/its/base/workflow/AddPropertyToFieldParametersExtractorTest.java
@@ -15,16 +15,17 @@
 package com.googlesource.gerrit.plugins.its.base.workflow;
 
 import static com.google.common.truth.Truth8.assertThat;
-import static org.easymock.EasyMock.expect;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
 
 import com.google.gerrit.extensions.config.FactoryModule;
 import com.google.inject.Guice;
 import com.google.inject.Injector;
-import com.googlesource.gerrit.plugins.its.base.testutil.MockingTestCase;
 import java.util.Collections;
 import java.util.Optional;
+import junit.framework.TestCase;
 
-public class AddPropertyToFieldParametersExtractorTest extends MockingTestCase {
+public class AddPropertyToFieldParametersExtractorTest extends TestCase {
 
   private static final String FIELD_ID = "fieldId";
   private static final String PROPERTY_ID = "propertyId";
@@ -54,46 +55,36 @@
   }
 
   private void testWrongNumberOfReceivedParameters(String[] parameters) {
-    ActionRequest actionRequest = createMock(ActionRequest.class);
-    expect(actionRequest.getParameters()).andReturn(parameters);
-
-    replayMocks();
+    ActionRequest actionRequest = mock(ActionRequest.class);
+    when(actionRequest.getParameters()).thenReturn(parameters);
 
     assertFalse(extractor.extract(actionRequest, Collections.emptyMap()).isPresent());
   }
 
   public void testBlankFieldId() {
-    ActionRequest actionRequest = createMock(ActionRequest.class);
-    expect(actionRequest.getParameters()).andReturn(new String[] {PROPERTY_ID, ""});
-
-    replayMocks();
+    ActionRequest actionRequest = mock(ActionRequest.class);
+    when(actionRequest.getParameters()).thenReturn(new String[] {PROPERTY_ID, ""});
 
     assertFalse(extractor.extract(actionRequest, Collections.emptyMap()).isPresent());
   }
 
   public void testBlankPropertyId() {
-    ActionRequest actionRequest = createMock(ActionRequest.class);
-    expect(actionRequest.getParameters()).andReturn(new String[] {"", FIELD_ID});
-
-    replayMocks();
+    ActionRequest actionRequest = mock(ActionRequest.class);
+    when(actionRequest.getParameters()).thenReturn(new String[] {"", FIELD_ID});
 
     assertFalse(extractor.extract(actionRequest, Collections.emptyMap()).isPresent());
   }
 
   public void testUnknownPropertyId() {
-    ActionRequest actionRequest = createMock(ActionRequest.class);
-    expect(actionRequest.getParameters()).andReturn(new String[] {FIELD_ID, PROPERTY_ID});
-
-    replayMocks();
+    ActionRequest actionRequest = mock(ActionRequest.class);
+    when(actionRequest.getParameters()).thenReturn(new String[] {FIELD_ID, PROPERTY_ID});
 
     assertFalse(extractor.extract(actionRequest, Collections.emptyMap()).isPresent());
   }
 
   public void testHappyPath() {
-    ActionRequest actionRequest = createMock(ActionRequest.class);
-    expect(actionRequest.getParameters()).andReturn(new String[] {PROPERTY_ID, FIELD_ID});
-
-    replayMocks();
+    ActionRequest actionRequest = mock(ActionRequest.class);
+    when(actionRequest.getParameters()).thenReturn(new String[] {PROPERTY_ID, FIELD_ID});
 
     Optional<AddPropertyToFieldParameters> extractedParameters =
         extractor.extract(actionRequest, Collections.singletonMap(PROPERTY_ID, PROPERTY_VALUE));
diff --git a/src/test/java/com/googlesource/gerrit/plugins/its/base/workflow/AddPropertyToFieldTest.java b/src/test/java/com/googlesource/gerrit/plugins/its/base/workflow/AddPropertyToFieldTest.java
index a601b04..0f05875 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/its/base/workflow/AddPropertyToFieldTest.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/its/base/workflow/AddPropertyToFieldTest.java
@@ -14,20 +14,21 @@
 
 package com.googlesource.gerrit.plugins.its.base.workflow;
 
-import static org.easymock.EasyMock.expect;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
 
 import com.google.gerrit.extensions.config.FactoryModule;
 import com.google.inject.Guice;
 import com.google.inject.Injector;
 import com.googlesource.gerrit.plugins.its.base.its.ItsFacade;
-import com.googlesource.gerrit.plugins.its.base.testutil.MockingTestCase;
 import java.io.IOException;
 import java.util.Collections;
 import java.util.Map;
 import java.util.Optional;
-import org.easymock.EasyMock;
+import junit.framework.TestCase;
 
-public class AddPropertyToFieldTest extends MockingTestCase {
+public class AddPropertyToFieldTest extends TestCase {
 
   private static final String ISSUE_ID = "4711";
   private static final String FIELD_ID = "fieldId";
@@ -47,28 +48,25 @@
   private class TestModule extends FactoryModule {
     @Override
     protected void configure() {
-      parametersExtractor = createMock(AddPropertyToFieldParametersExtractor.class);
+      parametersExtractor = mock(AddPropertyToFieldParametersExtractor.class);
       bind(AddPropertyToFieldParametersExtractor.class).toInstance(parametersExtractor);
 
-      its = createMock(ItsFacade.class);
+      its = mock(ItsFacade.class);
       bind(ItsFacade.class).toInstance(its);
     }
   }
 
   public void testHappyPath() throws IOException {
-    ActionRequest actionRequest = createMock(ActionRequest.class);
+    ActionRequest actionRequest = mock(ActionRequest.class);
 
     Map<String, String> properties = Collections.singletonMap(PROPERTY_ID, PROPERTY_VALUE);
-    expect(parametersExtractor.extract(actionRequest, properties))
-        .andReturn(Optional.of(new AddPropertyToFieldParameters(PROPERTY_VALUE, FIELD_ID)));
-
-    its.addValueToField(ISSUE_ID, PROPERTY_VALUE, FIELD_ID);
-    EasyMock.expectLastCall().once();
-
-    replayMocks();
+    when(parametersExtractor.extract(actionRequest, properties))
+        .thenReturn(Optional.of(new AddPropertyToFieldParameters(PROPERTY_VALUE, FIELD_ID)));
 
     AddPropertyToField addPropertyToField = createAddPropertyToField();
     addPropertyToField.execute(its, ISSUE_ID, actionRequest, properties);
+
+    verify(its).addValueToField(ISSUE_ID, PROPERTY_VALUE, FIELD_ID);
   }
 
   private AddPropertyToField createAddPropertyToField() {
diff --git a/src/test/java/com/googlesource/gerrit/plugins/its/base/workflow/AddStandardCommentTest.java b/src/test/java/com/googlesource/gerrit/plugins/its/base/workflow/AddStandardCommentTest.java
index d695bd1..ab11820 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/its/base/workflow/AddStandardCommentTest.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/its/base/workflow/AddStandardCommentTest.java
@@ -13,6 +13,9 @@
 // limitations under the License.
 package com.googlesource.gerrit.plugins.its.base.workflow;
 
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+
 import com.google.common.collect.ImmutableMap;
 import com.google.gerrit.extensions.config.FactoryModule;
 import com.google.inject.Guice;
@@ -28,19 +31,18 @@
   private ItsFacade its;
 
   public void testChangeMergedPlain() throws IOException {
-    ActionRequest actionRequest = createMock(ActionRequest.class);
+    ActionRequest actionRequest = mock(ActionRequest.class);
 
     Map<String, String> properties = ImmutableMap.of("event-type", "change-merged");
 
-    its.addComment("42", "Change merged");
-    replayMocks();
-
     StandardAction action = injector.getInstance(AddStandardComment.class);
     action.execute(its, "42", actionRequest, properties);
+
+    verify(its).addComment("42", "Change merged");
   }
 
   public void testChangeMergedFull() throws IOException {
-    ActionRequest actionRequest = createMock(ActionRequest.class);
+    ActionRequest actionRequest = mock(ActionRequest.class);
 
     Map<String, String> properties =
         ImmutableMap.<String, String>builder()
@@ -51,32 +53,31 @@
             .put("formatChangeUrl", "HtTp://ExAmPlE.OrG/ChAnGe")
             .build();
 
-    its.addComment(
-        "176",
-        "Change 4711 merged by John Doe:\n"
-            + "Test-Change-Subject\n"
-            + "\n"
-            + "HtTp://ExAmPlE.OrG/ChAnGe");
-    replayMocks();
-
     StandardAction action = injector.getInstance(AddStandardComment.class);
     action.execute(its, "176", actionRequest, properties);
+
+    verify(its)
+        .addComment(
+            "176",
+            "Change 4711 merged by John Doe:\n"
+                + "Test-Change-Subject\n"
+                + "\n"
+                + "HtTp://ExAmPlE.OrG/ChAnGe");
   }
 
   public void testChangeAbandonedPlain() throws IOException {
-    ActionRequest actionRequest = createMock(ActionRequest.class);
+    ActionRequest actionRequest = mock(ActionRequest.class);
 
     Map<String, String> properties = ImmutableMap.of("event-type", "change-abandoned");
 
-    its.addComment("42", "Change abandoned");
-    replayMocks();
-
     StandardAction action = injector.getInstance(AddStandardComment.class);
     action.execute(its, "42", actionRequest, properties);
+
+    verify(its).addComment("42", "Change abandoned");
   }
 
   public void testChangeAbandonedFull() throws IOException {
-    ActionRequest actionRequest = createMock(ActionRequest.class);
+    ActionRequest actionRequest = mock(ActionRequest.class);
 
     Map<String, String> properties =
         ImmutableMap.<String, String>builder()
@@ -88,35 +89,34 @@
             .put("formatChangeUrl", "HtTp://ExAmPlE.OrG/ChAnGe")
             .build();
 
-    its.addComment(
-        "176",
-        "Change 4711 abandoned by John Doe:\n"
-            + "Test-Change-Subject\n"
-            + "\n"
-            + "Reason:\n"
-            + "Test-Reason\n"
-            + "\n"
-            + "HtTp://ExAmPlE.OrG/ChAnGe");
-    replayMocks();
-
     StandardAction action = injector.getInstance(AddStandardComment.class);
     action.execute(its, "176", actionRequest, properties);
+
+    verify(its)
+        .addComment(
+            "176",
+            "Change 4711 abandoned by John Doe:\n"
+                + "Test-Change-Subject\n"
+                + "\n"
+                + "Reason:\n"
+                + "Test-Reason\n"
+                + "\n"
+                + "HtTp://ExAmPlE.OrG/ChAnGe");
   }
 
   public void testChangeRestoredPlain() throws IOException {
-    ActionRequest actionRequest = createMock(ActionRequest.class);
+    ActionRequest actionRequest = mock(ActionRequest.class);
 
     Map<String, String> properties = ImmutableMap.of("event-type", "change-restored");
 
-    its.addComment("42", "Change restored");
-    replayMocks();
-
     StandardAction action = injector.getInstance(AddStandardComment.class);
     action.execute(its, "42", actionRequest, properties);
+
+    verify(its).addComment("42", "Change restored");
   }
 
   public void testChangeRestoredFull() throws IOException {
-    ActionRequest actionRequest = createMock(ActionRequest.class);
+    ActionRequest actionRequest = mock(ActionRequest.class);
 
     Map<String, String> properties =
         ImmutableMap.<String, String>builder()
@@ -128,35 +128,34 @@
             .put("formatChangeUrl", "HtTp://ExAmPlE.OrG/ChAnGe")
             .build();
 
-    its.addComment(
-        "176",
-        "Change 4711 restored by John Doe:\n"
-            + "Test-Change-Subject\n"
-            + "\n"
-            + "Reason:\n"
-            + "Test-Reason\n"
-            + "\n"
-            + "HtTp://ExAmPlE.OrG/ChAnGe");
-    replayMocks();
-
     StandardAction action = injector.getInstance(AddStandardComment.class);
     action.execute(its, "176", actionRequest, properties);
+
+    verify(its)
+        .addComment(
+            "176",
+            "Change 4711 restored by John Doe:\n"
+                + "Test-Change-Subject\n"
+                + "\n"
+                + "Reason:\n"
+                + "Test-Reason\n"
+                + "\n"
+                + "HtTp://ExAmPlE.OrG/ChAnGe");
   }
 
   public void testPatchSetCreatedPlain() throws IOException {
-    ActionRequest actionRequest = createMock(ActionRequest.class);
+    ActionRequest actionRequest = mock(ActionRequest.class);
 
     Map<String, String> properties = ImmutableMap.of("event-type", "patchset-created");
 
-    its.addComment("42", "Change had a related patch set uploaded");
-    replayMocks();
-
     StandardAction action = injector.getInstance(AddStandardComment.class);
     action.execute(its, "42", actionRequest, properties);
+
+    verify(its).addComment("42", "Change had a related patch set uploaded");
   }
 
   public void testPatchSetCreatedFull() throws IOException {
-    ActionRequest actionRequest = createMock(ActionRequest.class);
+    ActionRequest actionRequest = mock(ActionRequest.class);
 
     Map<String, String> properties =
         ImmutableMap.<String, String>builder()
@@ -167,17 +166,17 @@
             .put("formatChangeUrl", "HtTp://ExAmPlE.OrG/ChAnGe")
             .build();
 
-    its.addComment(
-        "176",
-        "Change 4711 had a related patch set uploaded by "
-            + "John Doe:\n"
-            + "Test-Change-Subject\n"
-            + "\n"
-            + "HtTp://ExAmPlE.OrG/ChAnGe");
-    replayMocks();
-
     StandardAction action = injector.getInstance(AddStandardComment.class);
     action.execute(its, "176", actionRequest, properties);
+
+    verify(its)
+        .addComment(
+            "176",
+            "Change 4711 had a related patch set uploaded by "
+                + "John Doe:\n"
+                + "Test-Change-Subject\n"
+                + "\n"
+                + "HtTp://ExAmPlE.OrG/ChAnGe");
   }
 
   @Override
@@ -190,7 +189,7 @@
   private class TestModule extends FactoryModule {
     @Override
     protected void configure() {
-      its = createMock(ItsFacade.class);
+      its = mock(ItsFacade.class);
       bind(ItsFacade.class).toInstance(its);
     }
   }
diff --git a/src/test/java/com/googlesource/gerrit/plugins/its/base/workflow/ConditionTest.java b/src/test/java/com/googlesource/gerrit/plugins/its/base/workflow/ConditionTest.java
index 3df38cc..b31b3e2 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/its/base/workflow/ConditionTest.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/its/base/workflow/ConditionTest.java
@@ -33,8 +33,6 @@
 
     Map<String, String> properties = ImmutableMap.of("testKey", "testValue");
 
-    replayMocks();
-
     assertTrue("isMetBy gave false", condition.isMetBy(properties));
   }
 
@@ -43,8 +41,6 @@
 
     Map<String, String> properties = ImmutableMap.of();
 
-    replayMocks();
-
     assertFalse("isMetBy gave true", condition.isMetBy(properties));
   }
 
@@ -53,8 +49,6 @@
 
     Map<String, String> properties = ImmutableMap.of("otherKey", "testValue");
 
-    replayMocks();
-
     assertFalse("isMetBy gave true", condition.isMetBy(properties));
   }
 
@@ -63,8 +57,6 @@
 
     Map<String, String> properties = ImmutableMap.of("testKey", "otherValue");
 
-    replayMocks();
-
     assertFalse("isMetBy gave true", condition.isMetBy(properties));
   }
 
@@ -73,8 +65,6 @@
 
     Map<String, String> properties = ImmutableMap.of("testKey", "value2");
 
-    replayMocks();
-
     assertTrue("isMetBy gave false", condition.isMetBy(properties));
   }
 
@@ -83,8 +73,6 @@
 
     Map<String, String> properties = ImmutableMap.of("testKey", "value1 value3");
 
-    replayMocks();
-
     assertTrue("isMetBy gave false", condition.isMetBy(properties));
   }
 
@@ -93,8 +81,6 @@
 
     Map<String, String> properties = ImmutableMap.of("testKey", "value1 value3");
 
-    replayMocks();
-
     assertTrue("isMetBy gave false", condition.isMetBy(properties));
   }
 
@@ -103,8 +89,6 @@
 
     Map<String, String> properties = ImmutableMap.of("testKey", "value1 value2 value3");
 
-    replayMocks();
-
     assertTrue("isMetBy gave false", condition.isMetBy(properties));
   }
 
@@ -113,8 +97,6 @@
 
     Map<String, String> properties = ImmutableMap.of("testKey", "otherValue1 value2 otherValue3");
 
-    replayMocks();
-
     assertTrue("isMetBy gave false", condition.isMetBy(properties));
   }
 
@@ -123,8 +105,6 @@
 
     Map<String, String> properties = ImmutableMap.of();
 
-    replayMocks();
-
     assertTrue("isMetBy gave false", condition.isMetBy(properties));
   }
 
@@ -133,8 +113,6 @@
 
     Map<String, String> properties = ImmutableMap.of("otherKey", "testValue");
 
-    replayMocks();
-
     assertTrue("isMetBy gave false", condition.isMetBy(properties));
   }
 
@@ -143,8 +121,6 @@
 
     Map<String, String> properties = ImmutableMap.of("testKey", "otherValue");
 
-    replayMocks();
-
     assertTrue("isMetBy gave false", condition.isMetBy(properties));
   }
 
@@ -153,8 +129,6 @@
 
     Map<String, String> properties = ImmutableMap.of("testKey", "otherValue");
 
-    replayMocks();
-
     assertTrue("isMetBy gave false", condition.isMetBy(properties));
   }
 
@@ -163,8 +137,6 @@
 
     Map<String, String> properties = ImmutableMap.of("testKey", "value1");
 
-    replayMocks();
-
     assertFalse("isMetBy gave true", condition.isMetBy(properties));
   }
 
@@ -173,8 +145,6 @@
 
     Map<String, String> properties = ImmutableMap.of("testKey", "value1 value3");
 
-    replayMocks();
-
     assertFalse("isMetBy gave true", condition.isMetBy(properties));
   }
 
@@ -183,8 +153,6 @@
 
     Map<String, String> properties = ImmutableMap.of("testKey", "value1 value2 value3");
 
-    replayMocks();
-
     assertFalse("isMetBy gave true", condition.isMetBy(properties));
   }
 
@@ -192,7 +160,6 @@
     Condition condition = createCondition("testKey", "!,value1,value2,value3");
 
     Map<String, String> properties = ImmutableMap.of("testKey", "otherValue1 value2 otherValue3");
-    replayMocks();
 
     assertFalse("isMetBy gave true", condition.isMetBy(properties));
   }
diff --git a/src/test/java/com/googlesource/gerrit/plugins/its/base/workflow/CreateVersionFromPropertyParametersExtractorTest.java b/src/test/java/com/googlesource/gerrit/plugins/its/base/workflow/CreateVersionFromPropertyParametersExtractorTest.java
index d153109..881fd6c 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/its/base/workflow/CreateVersionFromPropertyParametersExtractorTest.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/its/base/workflow/CreateVersionFromPropertyParametersExtractorTest.java
@@ -1,16 +1,17 @@
 package com.googlesource.gerrit.plugins.its.base.workflow;
 
 import static com.google.common.truth.Truth8.assertThat;
-import static org.easymock.EasyMock.expect;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
 
 import com.google.gerrit.extensions.config.FactoryModule;
 import com.google.inject.Guice;
 import com.google.inject.Injector;
-import com.googlesource.gerrit.plugins.its.base.testutil.MockingTestCase;
 import java.util.Collections;
 import java.util.Optional;
+import junit.framework.TestCase;
 
-public class CreateVersionFromPropertyParametersExtractorTest extends MockingTestCase {
+public class CreateVersionFromPropertyParametersExtractorTest extends TestCase {
 
   private static final String PROPERTY_ID = "propertyId";
   private static final String PROPERTY_VALUE = "propertyValue";
@@ -35,10 +36,8 @@
   }
 
   private void testWrongNumberOfReceivedParameters(String[] parameters) {
-    ActionRequest actionRequest = createMock(ActionRequest.class);
-    expect(actionRequest.getParameters()).andReturn(parameters);
-
-    replayMocks();
+    ActionRequest actionRequest = mock(ActionRequest.class);
+    when(actionRequest.getParameters()).thenReturn(parameters);
 
     Optional<CreateVersionFromPropertyParameters> extractedParameters =
         extractor.extract(actionRequest, Collections.emptyMap());
@@ -46,10 +45,8 @@
   }
 
   public void testBlankPropertyId() {
-    ActionRequest actionRequest = createMock(ActionRequest.class);
-    expect(actionRequest.getParameters()).andReturn(new String[] {""});
-
-    replayMocks();
+    ActionRequest actionRequest = mock(ActionRequest.class);
+    when(actionRequest.getParameters()).thenReturn(new String[] {""});
 
     Optional<CreateVersionFromPropertyParameters> extractedParameters =
         extractor.extract(actionRequest, Collections.emptyMap());
@@ -57,10 +54,8 @@
   }
 
   public void testUnknownPropertyId() {
-    ActionRequest actionRequest = createMock(ActionRequest.class);
-    expect(actionRequest.getParameters()).andReturn(new String[] {PROPERTY_ID});
-
-    replayMocks();
+    ActionRequest actionRequest = mock(ActionRequest.class);
+    when(actionRequest.getParameters()).thenReturn(new String[] {PROPERTY_ID});
 
     Optional<CreateVersionFromPropertyParameters> extractedParameters =
         extractor.extract(actionRequest, Collections.emptyMap());
@@ -68,10 +63,8 @@
   }
 
   public void testHappyPath() {
-    ActionRequest actionRequest = createMock(ActionRequest.class);
-    expect(actionRequest.getParameters()).andReturn(new String[] {PROPERTY_ID});
-
-    replayMocks();
+    ActionRequest actionRequest = mock(ActionRequest.class);
+    when(actionRequest.getParameters()).thenReturn(new String[] {PROPERTY_ID});
 
     Optional<CreateVersionFromPropertyParameters> extractedParameters =
         extractor.extract(actionRequest, Collections.singletonMap(PROPERTY_ID, PROPERTY_VALUE));
diff --git a/src/test/java/com/googlesource/gerrit/plugins/its/base/workflow/CreateVersionFromPropertyTest.java b/src/test/java/com/googlesource/gerrit/plugins/its/base/workflow/CreateVersionFromPropertyTest.java
index 19735be..7f3e2e0 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/its/base/workflow/CreateVersionFromPropertyTest.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/its/base/workflow/CreateVersionFromPropertyTest.java
@@ -14,20 +14,21 @@
 
 package com.googlesource.gerrit.plugins.its.base.workflow;
 
-import static org.easymock.EasyMock.expect;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
 
 import com.google.gerrit.extensions.config.FactoryModule;
 import com.google.inject.Guice;
 import com.google.inject.Injector;
 import com.googlesource.gerrit.plugins.its.base.its.ItsFacade;
-import com.googlesource.gerrit.plugins.its.base.testutil.MockingTestCase;
 import java.io.IOException;
 import java.util.Collections;
 import java.util.Map;
 import java.util.Optional;
-import org.easymock.EasyMock;
+import junit.framework.TestCase;
 
-public class CreateVersionFromPropertyTest extends MockingTestCase {
+public class CreateVersionFromPropertyTest extends TestCase {
 
   private static final String ITS_PROJECT = "test-project";
   private static final String PROPERTY_VALUE = "propertyValue";
@@ -45,28 +46,25 @@
   private class TestModule extends FactoryModule {
     @Override
     protected void configure() {
-      its = createMock(ItsFacade.class);
+      its = mock(ItsFacade.class);
       bind(ItsFacade.class).toInstance(its);
 
-      parametersExtractor = createMock(CreateVersionFromPropertyParametersExtractor.class);
+      parametersExtractor = mock(CreateVersionFromPropertyParametersExtractor.class);
       bind(CreateVersionFromPropertyParametersExtractor.class).toInstance(parametersExtractor);
     }
   }
 
   public void testHappyPath() throws IOException {
-    ActionRequest actionRequest = createMock(ActionRequest.class);
+    ActionRequest actionRequest = mock(ActionRequest.class);
 
     Map<String, String> properties = Collections.emptyMap();
-    expect(parametersExtractor.extract(actionRequest, properties))
-        .andReturn(Optional.of(new CreateVersionFromPropertyParameters(PROPERTY_VALUE)));
-
-    its.createVersion(ITS_PROJECT, PROPERTY_VALUE);
-    EasyMock.expectLastCall().once();
-
-    replayMocks();
+    when(parametersExtractor.extract(actionRequest, properties))
+        .thenReturn(Optional.of(new CreateVersionFromPropertyParameters(PROPERTY_VALUE)));
 
     CreateVersionFromProperty createVersionFromProperty = createCreateVersionFromProperty();
     createVersionFromProperty.execute(its, ITS_PROJECT, actionRequest, properties);
+
+    verify(its).createVersion(ITS_PROJECT, PROPERTY_VALUE);
   }
 
   private CreateVersionFromProperty createCreateVersionFromProperty() {
diff --git a/src/test/java/com/googlesource/gerrit/plugins/its/base/workflow/ItsRulesProjectCacheTest.java b/src/test/java/com/googlesource/gerrit/plugins/its/base/workflow/ItsRulesProjectCacheTest.java
index 2da7258..592722c 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/its/base/workflow/ItsRulesProjectCacheTest.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/its/base/workflow/ItsRulesProjectCacheTest.java
@@ -16,8 +16,9 @@
 
 import static com.googlesource.gerrit.plugins.its.base.workflow.RulesConfigReader.ACTION_KEY;
 import static com.googlesource.gerrit.plugins.its.base.workflow.RulesConfigReader.RULE_SECTION;
-import static org.easymock.EasyMock.expect;
-import static org.easymock.EasyMock.isA;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
 
 import com.google.common.collect.FluentIterable;
 import com.google.common.collect.ImmutableList;
@@ -35,16 +36,17 @@
 import java.io.IOException;
 import java.util.Collection;
 import java.util.List;
+import java.util.Optional;
 import org.eclipse.jgit.lib.Config;
 
 public class ItsRulesProjectCacheTest extends LoggingMockingTestCase {
   private class TestModule extends FactoryModule {
     @Override
     protected void configure() {
-      rulesConfigReader = createMock(RulesConfigReader.class);
+      rulesConfigReader = mock(RulesConfigReader.class);
       bind(RulesConfigReader.class).toInstance(rulesConfigReader);
 
-      projectCache = createMock(ProjectCache.class);
+      projectCache = mock(ProjectCache.class);
       bind(ProjectCache.class).toInstance(projectCache);
 
       bind(String.class)
@@ -79,22 +81,20 @@
     rule1.addActionRequest(action1);
     rule1.addCondition(condition1);
 
-    ProjectState projectState = createMock(ProjectState.class);
-    ProjectLevelConfig projectLevelConfigGlobal = createMock(ProjectLevelConfig.class);
+    ProjectState projectState = mock(ProjectState.class);
+    ProjectLevelConfig projectLevelConfigGlobal = mock(ProjectLevelConfig.class);
     Config projectGlobalCfg = new Config();
     projectGlobalCfg.setString(RULE_SECTION, RULE_1, CONDITION_KEY, VALUE_1);
     projectGlobalCfg.setString(RULE_SECTION, RULE_1, ACTION_KEY, ACTION_1);
-    expect(projectLevelConfigGlobal.get()).andReturn(projectGlobalCfg);
-    expect(projectState.getConfig(RuleBaseKind.GLOBAL.fileName))
-        .andReturn(projectLevelConfigGlobal);
-    ProjectLevelConfig projectLevelConfigPlugin = createMock(ProjectLevelConfig.class);
-    expect(projectLevelConfigPlugin.get()).andReturn(new Config());
-    expect(projectState.getConfig(RuleBaseKind.ITS.fileName)).andReturn(projectLevelConfigPlugin);
-    expect(projectCache.checkedGet(Project.nameKey(TEST_PROJECT))).andReturn(projectState);
-    expect(rulesConfigReader.getRulesFromConfig(isA(Config.class)))
-        .andReturn(ImmutableList.of(rule1))
-        .andReturn(ImmutableList.of());
-    replayMocks();
+    when(projectLevelConfigGlobal.get()).thenReturn(projectGlobalCfg);
+    when(projectState.getConfig(RuleBaseKind.GLOBAL.fileName)).thenReturn(projectLevelConfigGlobal);
+    ProjectLevelConfig projectLevelConfigPlugin = mock(ProjectLevelConfig.class);
+    when(projectLevelConfigPlugin.get()).thenReturn(new Config());
+    when(projectState.getConfig(RuleBaseKind.ITS.fileName)).thenReturn(projectLevelConfigPlugin);
+    when(projectCache.get(Project.nameKey(TEST_PROJECT))).thenReturn(Optional.of(projectState));
+    when(rulesConfigReader.getRulesFromConfig(any(Config.class)))
+        .thenReturn(ImmutableList.of(rule1))
+        .thenReturn(ImmutableList.of());
 
     ItsRulesProjectCacheImpl.Loader loader =
         injector.getInstance(ItsRulesProjectCacheImpl.Loader.class);
@@ -112,37 +112,34 @@
     rule1.addActionRequest(action1);
     rule1.addCondition(condition1);
 
-    ProjectState projectState = createMock(ProjectState.class);
-    ProjectLevelConfig projectLevelConfigGlobal = createMock(ProjectLevelConfig.class);
-    expect(projectLevelConfigGlobal.get()).andReturn(new Config());
-    expect(projectState.getConfig(RuleBaseKind.GLOBAL.fileName))
-        .andReturn(projectLevelConfigGlobal);
-    ProjectLevelConfig projectLevelConfigPlugin = createMock(ProjectLevelConfig.class);
-    expect(projectLevelConfigPlugin.get()).andReturn(new Config());
-    expect(projectState.getConfig(RuleBaseKind.ITS.fileName)).andReturn(projectLevelConfigPlugin);
+    ProjectState projectState = mock(ProjectState.class);
+    ProjectLevelConfig projectLevelConfigGlobal = mock(ProjectLevelConfig.class);
+    when(projectLevelConfigGlobal.get()).thenReturn(new Config());
+    when(projectState.getConfig(RuleBaseKind.GLOBAL.fileName)).thenReturn(projectLevelConfigGlobal);
+    ProjectLevelConfig projectLevelConfigPlugin = mock(ProjectLevelConfig.class);
+    when(projectLevelConfigPlugin.get()).thenReturn(new Config());
+    when(projectState.getConfig(RuleBaseKind.ITS.fileName)).thenReturn(projectLevelConfigPlugin);
 
-    ProjectState parentProjectState = createMock(ProjectState.class);
-    ProjectLevelConfig parentProjectConfigGlobal = createMock(ProjectLevelConfig.class);
+    ProjectState parentProjectState = mock(ProjectState.class);
+    ProjectLevelConfig parentProjectConfigGlobal = mock(ProjectLevelConfig.class);
     Config parentGlobalCfg = new Config();
     parentGlobalCfg.setString(RULE_SECTION, RULE_1, CONDITION_KEY, VALUE_1);
     parentGlobalCfg.setString(RULE_SECTION, RULE_1, ACTION_KEY, ACTION_1);
-    expect(parentProjectConfigGlobal.get()).andReturn(parentGlobalCfg);
-    expect(parentProjectState.getConfig(RuleBaseKind.GLOBAL.fileName))
-        .andReturn(parentProjectConfigGlobal);
-    ProjectLevelConfig parentProjectConfigPlugin = createMock(ProjectLevelConfig.class);
-    expect(parentProjectConfigPlugin.get()).andReturn(new Config());
-    expect(parentProjectState.getConfig(RuleBaseKind.ITS.fileName))
-        .andReturn(parentProjectConfigPlugin);
-    expect(projectState.parents()).andReturn(FluentIterable.of(parentProjectState));
-    expect(projectCache.checkedGet(Project.nameKey(TEST_PROJECT))).andReturn(projectState);
+    when(parentProjectConfigGlobal.get()).thenReturn(parentGlobalCfg);
+    when(parentProjectState.getConfig(RuleBaseKind.GLOBAL.fileName))
+        .thenReturn(parentProjectConfigGlobal);
+    ProjectLevelConfig parentProjectConfigPlugin = mock(ProjectLevelConfig.class);
+    when(parentProjectConfigPlugin.get()).thenReturn(new Config());
+    when(parentProjectState.getConfig(RuleBaseKind.ITS.fileName))
+        .thenReturn(parentProjectConfigPlugin);
+    when(projectState.parents()).thenReturn(FluentIterable.of(parentProjectState));
+    when(projectCache.get(Project.nameKey(TEST_PROJECT))).thenReturn(Optional.of(projectState));
 
-    expect(rulesConfigReader.getRulesFromConfig(isA(Config.class)))
-        .andReturn(ImmutableList.of())
-        .andReturn(ImmutableList.of())
-        .andReturn(ImmutableList.of(rule1))
-        .andReturn(ImmutableList.of());
-
-    replayMocks();
+    when(rulesConfigReader.getRulesFromConfig(any(Config.class)))
+        .thenReturn(ImmutableList.of())
+        .thenReturn(ImmutableList.of())
+        .thenReturn(ImmutableList.of(rule1))
+        .thenReturn(ImmutableList.of());
 
     ItsRulesProjectCacheImpl.Loader loader =
         injector.getInstance(ItsRulesProjectCacheImpl.Loader.class);
diff --git a/src/test/java/com/googlesource/gerrit/plugins/its/base/workflow/LogEventTest.java b/src/test/java/com/googlesource/gerrit/plugins/its/base/workflow/LogEventTest.java
index 0a26db8..5f82eae 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/its/base/workflow/LogEventTest.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/its/base/workflow/LogEventTest.java
@@ -13,7 +13,8 @@
 // limitations under the License.
 package com.googlesource.gerrit.plugins.its.base.workflow;
 
-import static org.easymock.EasyMock.expect;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
 
 import com.google.common.collect.ImmutableMap;
 import com.google.gerrit.extensions.config.FactoryModule;
@@ -30,33 +31,27 @@
   private ItsFacade its;
 
   public void testNull() throws IOException {
-    ActionRequest actionRequest = createMock(ActionRequest.class);
-    expect(actionRequest.getParameter(1)).andReturn(null);
-
-    replayMocks();
+    ActionRequest actionRequest = mock(ActionRequest.class);
+    when(actionRequest.getParameter(1)).thenReturn(null);
 
     LogEvent logEvent = createLogEvent();
     logEvent.execute(null, "4711", actionRequest, ImmutableMap.of());
   }
 
   public void testEmpty() throws IOException {
-    ActionRequest actionRequest = createMock(ActionRequest.class);
-    expect(actionRequest.getParameter(1)).andReturn("");
-
-    replayMocks();
+    ActionRequest actionRequest = mock(ActionRequest.class);
+    when(actionRequest.getParameter(1)).thenReturn("");
 
     LogEvent logEvent = createLogEvent();
     logEvent.execute(null, "4711", actionRequest, ImmutableMap.of());
   }
 
   public void testLevelDefault() throws IOException {
-    ActionRequest actionRequest = createMock(ActionRequest.class);
-    expect(actionRequest.getParameter(1)).andReturn("");
+    ActionRequest actionRequest = mock(ActionRequest.class);
+    when(actionRequest.getParameter(1)).thenReturn("");
 
     Map<String, String> properties = ImmutableMap.of("KeyA", "ValueA");
 
-    replayMocks();
-
     LogEvent logEvent = createLogEvent();
     logEvent.execute(its, "4711", actionRequest, properties);
 
@@ -64,13 +59,11 @@
   }
 
   public void testLevelError() throws IOException {
-    ActionRequest actionRequest = createMock(ActionRequest.class);
-    expect(actionRequest.getParameter(1)).andReturn("error");
+    ActionRequest actionRequest = mock(ActionRequest.class);
+    when(actionRequest.getParameter(1)).thenReturn("error");
 
     Map<String, String> properties = ImmutableMap.of("KeyA", "ValueA");
 
-    replayMocks();
-
     LogEvent logEvent = createLogEvent();
     logEvent.execute(its, "4711", actionRequest, properties);
 
@@ -78,13 +71,11 @@
   }
 
   public void testLevelWarn() throws IOException {
-    ActionRequest actionRequest = createMock(ActionRequest.class);
-    expect(actionRequest.getParameter(1)).andReturn("warn");
+    ActionRequest actionRequest = mock(ActionRequest.class);
+    when(actionRequest.getParameter(1)).thenReturn("warn");
 
     Map<String, String> properties = ImmutableMap.of("KeyA", "ValueA");
 
-    replayMocks();
-
     LogEvent logEvent = createLogEvent();
     logEvent.execute(its, "4711", actionRequest, properties);
 
@@ -92,13 +83,11 @@
   }
 
   public void testLevelInfo() throws IOException {
-    ActionRequest actionRequest = createMock(ActionRequest.class);
-    expect(actionRequest.getParameter(1)).andReturn("info");
+    ActionRequest actionRequest = mock(ActionRequest.class);
+    when(actionRequest.getParameter(1)).thenReturn("info");
 
     Map<String, String> properties = ImmutableMap.of("KeyA", "ValueA");
 
-    replayMocks();
-
     LogEvent logEvent = createLogEvent();
     logEvent.execute(its, "4711", actionRequest, properties);
 
@@ -106,13 +95,11 @@
   }
 
   public void testLevelDebug() throws IOException {
-    ActionRequest actionRequest = createMock(ActionRequest.class);
-    expect(actionRequest.getParameter(1)).andReturn("debug");
+    ActionRequest actionRequest = mock(ActionRequest.class);
+    when(actionRequest.getParameter(1)).thenReturn("debug");
 
     Map<String, String> properties = ImmutableMap.of("KeyA", "ValueA");
 
-    replayMocks();
-
     LogEvent logEvent = createLogEvent();
     logEvent.execute(its, "4711", actionRequest, properties);
 
@@ -120,8 +107,8 @@
   }
 
   public void testMultipleProperties() throws IOException {
-    ActionRequest actionRequest = createMock(ActionRequest.class);
-    expect(actionRequest.getParameter(1)).andReturn("info");
+    ActionRequest actionRequest = mock(ActionRequest.class);
+    when(actionRequest.getParameter(1)).thenReturn("info");
 
     Map<String, String> properties =
         ImmutableMap.<String, String>builder()
@@ -130,8 +117,6 @@
             .put("KeyC", "ValueC")
             .build();
 
-    replayMocks();
-
     LogEvent logEvent = createLogEvent();
     logEvent.execute(its, "4711", actionRequest, properties);
 
@@ -153,7 +138,7 @@
   private class TestModule extends FactoryModule {
     @Override
     protected void configure() {
-      its = createMock(ItsFacade.class);
+      its = mock(ItsFacade.class);
     }
   }
 }
diff --git a/src/test/java/com/googlesource/gerrit/plugins/its/base/workflow/RuleBaseTest.java b/src/test/java/com/googlesource/gerrit/plugins/its/base/workflow/RuleBaseTest.java
index 305e8d1..717886c 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/its/base/workflow/RuleBaseTest.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/its/base/workflow/RuleBaseTest.java
@@ -14,8 +14,9 @@
 
 package com.googlesource.gerrit.plugins.its.base.workflow;
 
-import static org.easymock.EasyMock.expect;
-import static org.easymock.EasyMock.isA;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
@@ -66,22 +67,20 @@
     String rules = "[rule \"rule1\"]\n\taction = action1\n";
     injectRuleBase(rules);
 
-    Rule rule1 = createMock(Rule.class);
-    ActionRequest actionRequest1 = createMock(ActionRequest.class);
+    Rule rule1 = mock(Rule.class);
+    ActionRequest actionRequest1 = mock(ActionRequest.class);
 
     Map<String, String> properties = ImmutableMap.of(PROJECT_KEY, TEST_PROJECT);
 
     List<ActionRequest> rule1Match = Lists.newArrayListWithCapacity(1);
     rule1Match.add(actionRequest1);
-    expect(rule1.actionRequestsFor(properties)).andReturn(rule1Match);
+    when(rule1.actionRequestsFor(properties)).thenReturn(rule1Match);
 
-    expect(rulesConfigReader.getRulesFromConfig(isA(Config.class)))
-        .andReturn(ImmutableList.of(rule1))
-        .once();
+    when(rulesConfigReader.getRulesFromConfig(any(Config.class)))
+        .thenReturn(ImmutableList.of(rule1))
+        .thenThrow(new UnsupportedOperationException("Method called more than once"));
 
-    expect(rulesProjectCache.get(TEST_PROJECT)).andReturn(ImmutableList.of());
-
-    replayMocks();
+    when(rulesProjectCache.get(TEST_PROJECT)).thenReturn(ImmutableList.of());
 
     RuleBase ruleBase = createRuleBase();
     Collection<ActionRequest> actual = ruleBase.actionRequestsFor(properties);
@@ -101,29 +100,26 @@
             + "[rule \"rule2\"]\n"
             + "\taction = action3\n");
 
-    Rule rule1 = createMock(Rule.class);
-    ActionRequest actionRequest1 = createMock(ActionRequest.class);
-    ActionRequest actionRequest2 = createMock(ActionRequest.class);
+    Rule rule1 = mock(Rule.class);
+    ActionRequest actionRequest1 = mock(ActionRequest.class);
+    ActionRequest actionRequest2 = mock(ActionRequest.class);
 
-    Rule rule2 = createMock(Rule.class);
-    ActionRequest actionRequest3 = createMock(ActionRequest.class);
+    Rule rule2 = mock(Rule.class);
+    ActionRequest actionRequest3 = mock(ActionRequest.class);
 
     Map<String, String> properties = ImmutableMap.of(PROJECT_KEY, TEST_PROJECT);
 
     List<ActionRequest> rule1Match = ImmutableList.of(actionRequest1, actionRequest2);
-    expect(rule1.actionRequestsFor(properties)).andReturn(rule1Match).anyTimes();
+    when(rule1.actionRequestsFor(properties)).thenReturn(rule1Match);
 
     List<ActionRequest> rule2Match = ImmutableList.of(actionRequest3);
-    expect(rule2.actionRequestsFor(properties)).andReturn(rule2Match).anyTimes();
+    when(rule2.actionRequestsFor(properties)).thenReturn(rule2Match);
 
-    expect(rulesProjectCache.get(TEST_PROJECT)).andReturn(ImmutableList.of());
+    when(rulesProjectCache.get(TEST_PROJECT)).thenReturn(ImmutableList.of());
 
-    expect(rulesConfigReader.getRulesFromConfig(isA(Config.class)))
-        .andReturn(ImmutableList.of(rule1, rule2))
-        .andReturn(ImmutableList.of())
-        .anyTimes();
-
-    replayMocks();
+    when(rulesConfigReader.getRulesFromConfig(any(Config.class)))
+        .thenReturn(ImmutableList.of(rule1, rule2))
+        .thenReturn(ImmutableList.of());
 
     RuleBase ruleBase = createRuleBase();
     Collection<ActionRequest> actual = ruleBase.actionRequestsFor(properties);
@@ -140,26 +136,23 @@
 
     Map<String, String> properties = ImmutableMap.of(PROJECT_KEY, TEST_PROJECT);
 
-    Rule rule2 = createMock(Rule.class);
-    ActionRequest actionRequest2 = createMock(ActionRequest.class);
+    Rule rule2 = mock(Rule.class);
+    ActionRequest actionRequest2 = mock(ActionRequest.class);
 
     List<ActionRequest> rule2Match = ImmutableList.of(actionRequest2);
-    expect(rule2.actionRequestsFor(properties)).andReturn(rule2Match);
+    when(rule2.actionRequestsFor(properties)).thenReturn(rule2Match);
 
-    Rule rule3 = createMock(Rule.class);
-    ActionRequest actionRequest3 = createMock(ActionRequest.class);
+    Rule rule3 = mock(Rule.class);
+    ActionRequest actionRequest3 = mock(ActionRequest.class);
 
     List<ActionRequest> rule3Match = ImmutableList.of(actionRequest3);
-    expect(rule3.actionRequestsFor(properties)).andReturn(rule3Match);
+    when(rule3.actionRequestsFor(properties)).thenReturn(rule3Match);
 
-    expect(rulesProjectCache.get(TEST_PROJECT)).andReturn(ImmutableList.of());
+    when(rulesProjectCache.get(TEST_PROJECT)).thenReturn(ImmutableList.of());
 
-    expect(rulesConfigReader.getRulesFromConfig(isA(Config.class)))
-        .andReturn(ImmutableList.of(rule2, rule3))
-        .andReturn(ImmutableList.of())
-        .anyTimes();
-
-    replayMocks();
+    when(rulesConfigReader.getRulesFromConfig(any(Config.class)))
+        .thenReturn(ImmutableList.of(rule2, rule3))
+        .thenReturn(ImmutableList.of());
 
     RuleBase ruleBase = createRuleBase();
 
@@ -171,17 +164,15 @@
   }
 
   public void testProjectConfigIsLoaded() {
-    Rule rule1 = createMock(Rule.class);
-    ActionRequest actionRequest1 = createMock(ActionRequest.class);
+    Rule rule1 = mock(Rule.class);
+    ActionRequest actionRequest1 = mock(ActionRequest.class);
 
     Map<String, String> properties = ImmutableMap.of(PROJECT_KEY, TEST_PROJECT);
 
     List<ActionRequest> rule1Match = ImmutableList.of(actionRequest1);
-    expect(rule1.actionRequestsFor(properties)).andReturn(rule1Match);
+    when(rule1.actionRequestsFor(properties)).thenReturn(rule1Match);
 
-    expect(rulesProjectCache.get(TEST_PROJECT)).andReturn(ImmutableList.of(rule1));
-
-    replayMocks();
+    when(rulesProjectCache.get(TEST_PROJECT)).thenReturn(ImmutableList.of(rule1));
 
     RuleBase ruleBase = createRuleBase();
     Collection<ActionRequest> actual = ruleBase.actionRequestsFor(properties);
@@ -238,10 +229,10 @@
 
       bind(Path.class).annotatedWith(ItsPath.class).toInstance(itsPath);
 
-      rulesConfigReader = createMock(RulesConfigReader.class);
+      rulesConfigReader = mock(RulesConfigReader.class);
       bind(RulesConfigReader.class).toInstance(rulesConfigReader);
 
-      rulesProjectCache = createMock(ItsRulesProjectCache.class);
+      rulesProjectCache = mock(ItsRulesProjectCache.class);
       bind(ItsRulesProjectCache.class).toInstance(rulesProjectCache);
 
       bind(String.class)
diff --git a/src/test/java/com/googlesource/gerrit/plugins/its/base/workflow/RuleTest.java b/src/test/java/com/googlesource/gerrit/plugins/its/base/workflow/RuleTest.java
index c106a81..91f5072 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/its/base/workflow/RuleTest.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/its/base/workflow/RuleTest.java
@@ -13,7 +13,8 @@
 // limitations under the License.
 package com.googlesource.gerrit.plugins.its.base.workflow;
 
-import static org.easymock.EasyMock.expect;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
 
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Lists;
@@ -39,11 +40,9 @@
 
     Rule rule = createRule("testRule");
 
-    ActionRequest actionRequest1 = createMock(ActionRequest.class);
+    ActionRequest actionRequest1 = mock(ActionRequest.class);
     rule.addActionRequest(actionRequest1);
 
-    replayMocks();
-
     Collection<ActionRequest> actual = rule.actionRequestsFor(properties);
 
     Collection<ActionRequest> expected = Lists.newArrayListWithCapacity(1);
@@ -56,15 +55,13 @@
 
     Rule rule = createRule("testRule");
 
-    Condition condition1 = createMock(Condition.class);
-    expect(condition1.isMetBy(properties)).andReturn(false).anyTimes();
+    Condition condition1 = mock(Condition.class);
+    when(condition1.isMetBy(properties)).thenReturn(false);
     rule.addCondition(condition1);
 
-    ActionRequest actionRequest1 = createMock(ActionRequest.class);
+    ActionRequest actionRequest1 = mock(ActionRequest.class);
     rule.addActionRequest(actionRequest1);
 
-    replayMocks();
-
     Collection<ActionRequest> actual = rule.actionRequestsFor(properties);
 
     List<ActionRequest> expected = Collections.emptyList();
@@ -76,19 +73,17 @@
 
     Rule rule = createRule("testRule");
 
-    Condition condition1 = createMock(Condition.class);
-    expect(condition1.isMetBy(properties)).andReturn(true).anyTimes();
+    Condition condition1 = mock(Condition.class);
+    when(condition1.isMetBy(properties)).thenReturn(true);
     rule.addCondition(condition1);
 
-    Condition condition2 = createMock(Condition.class);
-    expect(condition2.isMetBy(properties)).andReturn(false).anyTimes();
+    Condition condition2 = mock(Condition.class);
+    when(condition2.isMetBy(properties)).thenReturn(false);
     rule.addCondition(condition2);
 
-    ActionRequest actionRequest1 = createMock(ActionRequest.class);
+    ActionRequest actionRequest1 = mock(ActionRequest.class);
     rule.addActionRequest(actionRequest1);
 
-    replayMocks();
-
     Collection<ActionRequest> actual = rule.actionRequestsFor(properties);
 
     List<ActionRequest> expected = Collections.emptyList();
@@ -100,14 +95,12 @@
 
     Rule rule = createRule("testRule");
 
-    ActionRequest actionRequest1 = createMock(ActionRequest.class);
+    ActionRequest actionRequest1 = mock(ActionRequest.class);
     rule.addActionRequest(actionRequest1);
 
-    ActionRequest actionRequest2 = createMock(ActionRequest.class);
+    ActionRequest actionRequest2 = mock(ActionRequest.class);
     rule.addActionRequest(actionRequest2);
 
-    replayMocks();
-
     Collection<ActionRequest> actual = rule.actionRequestsFor(properties);
 
     List<ActionRequest> expected = Lists.newArrayListWithCapacity(1);
diff --git a/src/test/java/com/googlesource/gerrit/plugins/its/base/workflow/RulesConfigReaderTest.java b/src/test/java/com/googlesource/gerrit/plugins/its/base/workflow/RulesConfigReaderTest.java
index 96fb869..12535f2 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/its/base/workflow/RulesConfigReaderTest.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/its/base/workflow/RulesConfigReaderTest.java
@@ -16,7 +16,9 @@
 
 import static com.googlesource.gerrit.plugins.its.base.workflow.RulesConfigReader.ACTION_KEY;
 import static com.googlesource.gerrit.plugins.its.base.workflow.RulesConfigReader.RULE_SECTION;
-import static org.easymock.EasyMock.expect;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
 
 import com.google.common.collect.ImmutableList;
 import com.google.gerrit.extensions.config.FactoryModule;
@@ -31,13 +33,13 @@
   private class TestModule extends FactoryModule {
     @Override
     protected void configure() {
-      ruleFactory = createMock(Rule.Factory.class);
+      ruleFactory = mock(Rule.Factory.class);
       bind(Rule.Factory.class).toInstance(ruleFactory);
 
-      conditionFactory = createMock(Condition.Factory.class);
+      conditionFactory = mock(Condition.Factory.class);
       bind(Condition.Factory.class).toInstance(conditionFactory);
 
-      actionRequestFactory = createMock(ActionRequest.Factory.class);
+      actionRequestFactory = mock(ActionRequest.Factory.class);
       bind(ActionRequest.Factory.class).toInstance(actionRequestFactory);
     }
   }
@@ -63,22 +65,21 @@
     cfg.setString(RULE_SECTION, RULE_1, CONDITION_KEY, VALUE_1);
     cfg.setString(RULE_SECTION, RULE_1, ACTION_KEY, ACTION_1);
 
-    Rule rule1 = createMock(Rule.class);
-    expect(ruleFactory.create(RULE_1)).andReturn(rule1);
+    Rule rule1 = mock(Rule.class);
+    when(ruleFactory.create(RULE_1)).thenReturn(rule1);
 
-    ActionRequest actionRequest1 = createMock(ActionRequest.class);
-    expect(actionRequestFactory.create(ACTION_1)).andReturn(actionRequest1);
-    rule1.addActionRequest(actionRequest1);
+    ActionRequest actionRequest1 = mock(ActionRequest.class);
+    when(actionRequestFactory.create(ACTION_1)).thenReturn(actionRequest1);
 
-    Condition condition1 = createMock(Condition.class);
-    expect(conditionFactory.create(CONDITION_KEY, VALUE_1)).andReturn(condition1);
-    rule1.addCondition(condition1);
-
-    replayMocks();
+    Condition condition1 = mock(Condition.class);
+    when(conditionFactory.create(CONDITION_KEY, VALUE_1)).thenReturn(condition1);
 
     Collection<Rule> expected = ImmutableList.of(rule1);
 
     RulesConfigReader rulesConfigReader = injector.getInstance(RulesConfigReader.class);
     assertEquals("Rules do not match", expected, rulesConfigReader.getRulesFromConfig(cfg));
+
+    verify(rule1).addActionRequest(actionRequest1);
+    verify(rule1).addCondition(condition1);
   }
 }
