diff --git a/phosphor-regulators/test/chassis_tests.cpp b/phosphor-regulators/test/chassis_tests.cpp
index 40c1f77..7963430 100644
--- a/phosphor-regulators/test/chassis_tests.cpp
+++ b/phosphor-regulators/test/chassis_tests.cpp
@@ -212,40 +212,51 @@
     devices.emplace_back(std::move(device));
     Chassis chassis{1, defaultInventoryPath, std::move(devices)};
 
-    // Create mock services
-    MockServices services{};
+    // Create lambda that sets MockServices expectations.  The lambda allows
+    // us to set expectations multiple times without duplicate code.
+    auto setExpectations = [](MockServices& services) {
+        // Expect Sensors service to be called 10 times
+        MockSensors& sensors = services.getMockSensors();
+        EXPECT_CALL(sensors, startRail).Times(10);
+        EXPECT_CALL(sensors, setValue).Times(0);
+        EXPECT_CALL(sensors, endRail).Times(10);
 
-    // Expect Sensors service to be called 5+5=10 times
-    MockSensors& sensors = services.getMockSensors();
-    EXPECT_CALL(sensors, startRail).Times(10);
-    EXPECT_CALL(sensors, setValue).Times(0);
-    EXPECT_CALL(sensors, endRail).Times(10);
+        // Expect Journal service to be called 6 times to log error messages
+        MockJournal& journal = services.getMockJournal();
+        EXPECT_CALL(journal, logError(A<const std::vector<std::string>&>()))
+            .Times(6);
+        EXPECT_CALL(journal, logError(A<const std::string&>())).Times(6);
 
-    // Expect Journal service to be called 3+3=6 times to log error messages
-    MockJournal& journal = services.getMockJournal();
-    EXPECT_CALL(journal, logError(A<const std::vector<std::string>&>()))
-        .Times(6);
-    EXPECT_CALL(journal, logError(A<const std::string&>())).Times(6);
+        // Expect ErrorLogging service to be called once to log a DBus error
+        MockErrorLogging& errorLogging = services.getMockErrorLogging();
+        EXPECT_CALL(errorLogging, logDBusError).Times(1);
+    };
 
-    // Expect ErrorLogging service to be called 1+1=2 times to log a DBus error
-    MockErrorLogging& errorLogging = services.getMockErrorLogging();
-    EXPECT_CALL(errorLogging, logDBusError).Times(2);
-
-    // Monitor sensors 5 times.  Should fail every time, write to journal 3
-    // times, and log one error.
-    for (int i = 1; i <= 5; ++i)
+    // Monitor sensors 10 times.  Verify errors logged.
     {
-        chassis.monitorSensors(services, *system);
+        // Create mock services.  Set expectations via lambda.
+        MockServices services{};
+        setExpectations(services);
+
+        for (int i = 1; i <= 10; ++i)
+        {
+            chassis.monitorSensors(services, *system);
+        }
     }
 
     // Clear error history
     chassis.clearErrorHistory();
 
-    // Monitor sensors 5 times again.  Should fail every time, write to journal
-    // 3 times, and log one error.
-    for (int i = 1; i <= 5; ++i)
+    // Monitor sensors 10 more times.  Verify errors logged again.
     {
-        chassis.monitorSensors(services, *system);
+        // Create mock services.  Set expectations via lambda.
+        MockServices services{};
+        setExpectations(services);
+
+        for (int i = 1; i <= 10; ++i)
+        {
+            chassis.monitorSensors(services, *system);
+        }
     }
 }
 
diff --git a/phosphor-regulators/test/device_tests.cpp b/phosphor-regulators/test/device_tests.cpp
index 5d9a0e4..0c43b1e 100644
--- a/phosphor-regulators/test/device_tests.cpp
+++ b/phosphor-regulators/test/device_tests.cpp
@@ -284,18 +284,18 @@
                   std::move(phaseFaultDetection),
                   std::move(rails)};
 
-    // Create lambda that sets MockServices expectations.  The lambda allows us
-    // to set the same expectations twice without duplicate code.
+    // Create lambda that sets MockServices expectations.  The lambda allows
+    // us to set expectations multiple times without duplicate code.
     auto setExpectations = [](MockServices& services) {
         // Set Journal service expectations:
-        // - 3 error messages for D-Bus errors
-        // - 3 error messages for inability to monitor sensors
+        // - 6 error messages for D-Bus errors
+        // - 6 error messages for inability to monitor sensors
         // - 2 error messages for the N phase fault
         MockJournal& journal = services.getMockJournal();
         EXPECT_CALL(journal, logError(std::vector<std::string>{"DBus Error"}))
-            .Times(3);
+            .Times(6);
         EXPECT_CALL(journal, logError("Unable to monitor sensors for rail vdd"))
-            .Times(3);
+            .Times(6);
         EXPECT_CALL(
             journal,
             logError("n phase fault detected in regulator reg2: count=1"))
@@ -313,19 +313,19 @@
         EXPECT_CALL(errorLogging, logPhaseFault).Times(1);
 
         // Set Sensors service expections:
-        // - startRail() and endRail() called 5 times
+        // - startRail() and endRail() called 10 times
         MockSensors& sensors = services.getMockSensors();
-        EXPECT_CALL(sensors, startRail).Times(5);
-        EXPECT_CALL(sensors, endRail).Times(5);
+        EXPECT_CALL(sensors, startRail).Times(10);
+        EXPECT_CALL(sensors, endRail).Times(10);
     };
 
-    // Monitor sensors and detect phase faults 5 times.  Verify errors logged.
+    // Monitor sensors and detect phase faults 10 times.  Verify errors logged.
     {
         // Create mock services.  Set expectations via lambda.
         MockServices services{};
         setExpectations(services);
 
-        for (int i = 1; i <= 5; ++i)
+        for (int i = 1; i <= 10; ++i)
         {
             device.monitorSensors(services, *system, *chassis);
             device.detectPhaseFaults(services, *system, *chassis);
@@ -335,14 +335,14 @@
     // Clear error history
     device.clearErrorHistory();
 
-    // Monitor sensors and detect phase faults 5 more times.  Verify errors
+    // Monitor sensors and detect phase faults 10 more times.  Verify errors
     // logged again.
     {
         // Create mock services.  Set expectations via lambda.
         MockServices services{};
         setExpectations(services);
 
-        for (int i = 1; i <= 5; ++i)
+        for (int i = 1; i <= 10; ++i)
         {
             device.monitorSensors(services, *system, *chassis);
             device.detectPhaseFaults(services, *system, *chassis);
diff --git a/phosphor-regulators/test/rail_tests.cpp b/phosphor-regulators/test/rail_tests.cpp
index db4294f..82bbbac 100644
--- a/phosphor-regulators/test/rail_tests.cpp
+++ b/phosphor-regulators/test/rail_tests.cpp
@@ -136,40 +136,51 @@
     chassisVec.emplace_back(std::move(chassis));
     System system{std::move(rules), std::move(chassisVec)};
 
-    // Create mock services
-    MockServices services{};
+    // Create lambda that sets MockServices expectations.  The lambda allows
+    // us to set expectations multiple times without duplicate code.
+    auto setExpectations = [](MockServices& services) {
+        // Expect Sensors service to be called 10 times
+        MockSensors& sensors = services.getMockSensors();
+        EXPECT_CALL(sensors, startRail).Times(10);
+        EXPECT_CALL(sensors, setValue).Times(0);
+        EXPECT_CALL(sensors, endRail(true)).Times(10);
 
-    // Expect Sensors service to be called 5+5=10 times
-    MockSensors& sensors = services.getMockSensors();
-    EXPECT_CALL(sensors, startRail).Times(10);
-    EXPECT_CALL(sensors, setValue).Times(0);
-    EXPECT_CALL(sensors, endRail).Times(10);
+        // Expect Journal service to be called 6 times to log error messages
+        MockJournal& journal = services.getMockJournal();
+        EXPECT_CALL(journal, logError(A<const std::vector<std::string>&>()))
+            .Times(6);
+        EXPECT_CALL(journal, logError(A<const std::string&>())).Times(6);
 
-    // Expect Journal service to be called 3+3=6 times to log error messages
-    MockJournal& journal = services.getMockJournal();
-    EXPECT_CALL(journal, logError(A<const std::vector<std::string>&>()))
-        .Times(6);
-    EXPECT_CALL(journal, logError(A<const std::string&>())).Times(6);
+        // Expect ErrorLogging service to be called once to log a DBus error
+        MockErrorLogging& errorLogging = services.getMockErrorLogging();
+        EXPECT_CALL(errorLogging, logDBusError).Times(1);
+    };
 
-    // Expect ErrorLogging service to be called 1+1=2 times to log a DBus error
-    MockErrorLogging& errorLogging = services.getMockErrorLogging();
-    EXPECT_CALL(errorLogging, logDBusError).Times(2);
-
-    // Monitor sensors 5 times.  Should fail every time, write to journal 3
-    // times, and log one error.
-    for (int i = 1; i <= 5; ++i)
+    // Monitor sensors 10 times.  Verify errors logged.
     {
-        railPtr->monitorSensors(services, system, *chassisPtr, *devicePtr);
+        // Create mock services.  Set expectations via lambda.
+        MockServices services{};
+        setExpectations(services);
+
+        for (int i = 1; i <= 10; ++i)
+        {
+            railPtr->monitorSensors(services, system, *chassisPtr, *devicePtr);
+        }
     }
 
     // Clear error history
     railPtr->clearErrorHistory();
 
-    // Monitor sensors 5 times again.  Should fail every time, write to journal
-    // 3 times, and log one error.
-    for (int i = 1; i <= 5; ++i)
+    // Monitor sensors 10 more times.  Verify errors logged again.
     {
-        railPtr->monitorSensors(services, system, *chassisPtr, *devicePtr);
+        // Create mock services.  Set expectations via lambda.
+        MockServices services{};
+        setExpectations(services);
+
+        for (int i = 1; i <= 10; ++i)
+        {
+            railPtr->monitorSensors(services, system, *chassisPtr, *devicePtr);
+        }
     }
 }
 
diff --git a/phosphor-regulators/test/sensor_monitoring_tests.cpp b/phosphor-regulators/test/sensor_monitoring_tests.cpp
index b8d56ff..f879442 100644
--- a/phosphor-regulators/test/sensor_monitoring_tests.cpp
+++ b/phosphor-regulators/test/sensor_monitoring_tests.cpp
@@ -152,31 +152,32 @@
         .WillRepeatedly(Throw(
             i2c::I2CException{"Failed to read word data", "/dev/i2c-1", 0x70}));
 
-    // Perform sensor monitoring 10 times to set error history data members
-    {
-        // Create mock services
-        MockServices services{};
-
-        // Set Sensors service expectations.  SensorMonitoring will be executed
-        // 10 times.
+    // Create lambda that sets MockServices expectations.  The lambda allows us
+    // to set expectations multiple times without duplicate code.
+    auto setExpectations = [](MockServices& services) {
+        // Expect Sensors service to be called 10 times
         MockSensors& sensors = services.getMockSensors();
         EXPECT_CALL(sensors, startRail).Times(10);
         EXPECT_CALL(sensors, setValue).Times(0);
         EXPECT_CALL(sensors, endRail(true)).Times(10);
 
-        // Set Journal service expectations.  SensorMonitoring should log error
-        // messages 3 times and then stop.
+        // Expect Journal service to be called 6 times to log error messages
         MockJournal& journal = services.getMockJournal();
         EXPECT_CALL(journal, logError(A<const std::vector<std::string>&>()))
-            .Times(3);
-        EXPECT_CALL(journal, logError(A<const std::string&>())).Times(3);
+            .Times(6);
+        EXPECT_CALL(journal, logError(A<const std::string&>())).Times(6);
 
-        // Set ErrorLogging service expectations.  SensorMonitoring should log
-        // an error only once.
+        // Expect ErrorLogging service to be called once to log an I2C error
         MockErrorLogging& errorLogging = services.getMockErrorLogging();
         EXPECT_CALL(errorLogging, logI2CError).Times(1);
+    };
 
-        // Execute SensorMonitoring 10 times
+    // Call execute() 10 times to set error history data members
+    {
+        // Create mock services.  Set expectations via lambda.
+        MockServices services{};
+        setExpectations(services);
+
         for (int i = 1; i <= 10; ++i)
         {
             monitoring->execute(services, *system, *chassis, *device, *rail);
@@ -186,32 +187,16 @@
     // Clear error history
     monitoring->clearErrorHistory();
 
-    // Perform sensor monitoring one more time.  Should log errors again.
+    // Call execute() 10 more times.  Should log errors again.
     {
-        // Create mock services
+        // Create mock services.  Set expectations via lambda.
         MockServices services{};
+        setExpectations(services);
 
-        // Set Sensors service expectations.  SensorMonitoring will be executed
-        // 1 time.
-        MockSensors& sensors = services.getMockSensors();
-        EXPECT_CALL(sensors, startRail).Times(1);
-        EXPECT_CALL(sensors, setValue).Times(0);
-        EXPECT_CALL(sensors, endRail(true)).Times(1);
-
-        // Set Journal service expectations.  SensorMonitoring should log error
-        // messages 1 time.
-        MockJournal& journal = services.getMockJournal();
-        EXPECT_CALL(journal, logError(A<const std::vector<std::string>&>()))
-            .Times(1);
-        EXPECT_CALL(journal, logError(A<const std::string&>())).Times(1);
-
-        // Set ErrorLogging server expectations.  SensorMonitoring should log an
-        // error.
-        MockErrorLogging& errorLogging = services.getMockErrorLogging();
-        EXPECT_CALL(errorLogging, logI2CError).Times(1);
-
-        // Execute SensorMonitoring
-        monitoring->execute(services, *system, *chassis, *device, *rail);
+        for (int i = 1; i <= 10; ++i)
+        {
+            monitoring->execute(services, *system, *chassis, *device, *rail);
+        }
     }
 }
 
@@ -279,54 +264,85 @@
         auto [system, chassis, device, i2cInterface, rail] =
             createParentObjects(std::unique_ptr<SensorMonitoring>{monitoring});
 
-        // Set I2CInterface expectations.  Should read register 0x8C 4 times.
-        EXPECT_CALL(*i2cInterface, isOpen)
-            .Times(4)
-            .WillRepeatedly(Return(true));
+        // Set I2CInterface expectations
+        EXPECT_CALL(*i2cInterface, isOpen).WillRepeatedly(Return(true));
         EXPECT_CALL(*i2cInterface, read(TypedEq<uint8_t>(0x8C), A<uint16_t&>()))
-            .Times(4)
             .WillRepeatedly(Throw(i2c::I2CException{"Failed to read word data",
                                                     "/dev/i2c-1", 0x70}));
 
-        // Create mock services
-        MockServices services{};
+        // Create lambda that sets MockServices expectations.  The lambda allows
+        // us to set expectations multiple times without duplicate code.
+        auto setExpectations = [](MockServices& services, int executeCount,
+                                  int journalCount, int errorLogCount) {
+            // Set Sensors service expectations
+            MockSensors& sensors = services.getMockSensors();
+            EXPECT_CALL(
+                sensors,
+                startRail("vdd",
+                          "/xyz/openbmc_project/inventory/system/chassis/"
+                          "motherboard/reg2",
+                          "/xyz/openbmc_project/inventory/system/chassis"))
+                .Times(executeCount);
+            EXPECT_CALL(sensors, setValue).Times(0);
+            EXPECT_CALL(sensors, endRail(true)).Times(executeCount);
 
-        // Set Sensors service expectations.  SensorMonitoring will be executed
-        // 4 times, and all should fail.
-        MockSensors& sensors = services.getMockSensors();
-        EXPECT_CALL(sensors,
-                    startRail("vdd",
-                              "/xyz/openbmc_project/inventory/system/chassis/"
-                              "motherboard/reg2",
-                              "/xyz/openbmc_project/inventory/system/chassis"))
-            .Times(4);
-        EXPECT_CALL(sensors, setValue).Times(0);
-        EXPECT_CALL(sensors, endRail(true)).Times(4);
+            // Set Journal service expectations
+            MockJournal& journal = services.getMockJournal();
+            std::vector<std::string> expectedErrMessagesException{
+                "I2CException: Failed to read word data: bus /dev/i2c-1, addr 0x70",
+                "ActionError: pmbus_read_sensor: { type: iout, command: 0x8C, "
+                "format: linear_11 }"};
+            EXPECT_CALL(journal, logError(expectedErrMessagesException))
+                .Times(journalCount);
+            EXPECT_CALL(journal,
+                        logError("Unable to monitor sensors for rail vdd"))
+                .Times(journalCount);
 
-        // Set Journal service expectations.  SensorMonitoring should log error
-        // messages 3 times and then stop.
-        MockJournal& journal = services.getMockJournal();
-        std::vector<std::string> expectedErrMessagesException{
-            "I2CException: Failed to read word data: bus /dev/i2c-1, addr 0x70",
-            "ActionError: pmbus_read_sensor: { type: iout, command: 0x8C, "
-            "format: linear_11 }"};
-        EXPECT_CALL(journal, logError(expectedErrMessagesException)).Times(3);
-        EXPECT_CALL(journal, logError("Unable to monitor sensors for rail vdd"))
-            .Times(3);
+            // Set ErrorLogging service expectations
+            MockErrorLogging& errorLogging = services.getMockErrorLogging();
+            EXPECT_CALL(errorLogging,
+                        logI2CError(Entry::Level::Warning, Ref(journal),
+                                    "/dev/i2c-1", 0x70, 0))
+                .Times(errorLogCount);
+        };
 
-        // Set ErrorLogging service expectations.  SensorMonitoring should log
-        // an error only once.
-        MockErrorLogging& errorLogging = services.getMockErrorLogging();
-        EXPECT_CALL(errorLogging,
-                    logI2CError(Entry::Level::Warning, Ref(journal),
-                                "/dev/i2c-1", 0x70, 0))
-            .Times(1);
-
-        // Execute SensorMonitoring 4 times
-        for (int i = 1; i <= 4; ++i)
+        // Call execute() 5 times.  Should log 5 journal messages and create 0
+        // error logs.
         {
+            // Create mock services.  Set expectations via lambda.
+            MockServices services{};
+            setExpectations(services, 5, 5, 0);
+
+            for (int i = 1; i <= 5; ++i)
+            {
+                monitoring->execute(services, *system, *chassis, *device,
+                                    *rail);
+            }
+        }
+
+        // Call execute() 1 more time.  Should log 1 journal message and create
+        // 1 error log.
+        {
+            // Create mock services.  Set expectations via lambda.
+            MockServices services{};
+            setExpectations(services, 1, 1, 1);
+
             monitoring->execute(services, *system, *chassis, *device, *rail);
         }
+
+        // Call execute() 5 more times.  Should log 0 journal messages and
+        // create 0 error logs.
+        {
+            // Create mock services.  Set expectations via lambda.
+            MockServices services{};
+            setExpectations(services, 5, 0, 0);
+
+            for (int i = 1; i <= 5; ++i)
+            {
+                monitoring->execute(services, *system, *chassis, *device,
+                                    *rail);
+            }
+        }
     }
 }
 
diff --git a/phosphor-regulators/test/system_tests.cpp b/phosphor-regulators/test/system_tests.cpp
index 720620d..1ea34b3 100644
--- a/phosphor-regulators/test/system_tests.cpp
+++ b/phosphor-regulators/test/system_tests.cpp
@@ -166,40 +166,51 @@
     chassisVec.emplace_back(std::move(chassis));
     System system{std::move(rules), std::move(chassisVec)};
 
-    // Create mock services
-    MockServices services{};
+    // Create lambda that sets MockServices expectations.  The lambda allows
+    // us to set expectations multiple times without duplicate code.
+    auto setExpectations = [](MockServices& services) {
+        // Expect Sensors service to be called 10 times
+        MockSensors& sensors = services.getMockSensors();
+        EXPECT_CALL(sensors, startRail).Times(10);
+        EXPECT_CALL(sensors, setValue).Times(0);
+        EXPECT_CALL(sensors, endRail).Times(10);
 
-    // Expect Sensors service to be called 5+5=10 times
-    MockSensors& sensors = services.getMockSensors();
-    EXPECT_CALL(sensors, startRail).Times(10);
-    EXPECT_CALL(sensors, setValue).Times(0);
-    EXPECT_CALL(sensors, endRail).Times(10);
+        // Expect Journal service to be called 6 times to log error messages
+        MockJournal& journal = services.getMockJournal();
+        EXPECT_CALL(journal, logError(A<const std::vector<std::string>&>()))
+            .Times(6);
+        EXPECT_CALL(journal, logError(A<const std::string&>())).Times(6);
 
-    // Expect Journal service to be called 3+3=6 times to log error messages
-    MockJournal& journal = services.getMockJournal();
-    EXPECT_CALL(journal, logError(A<const std::vector<std::string>&>()))
-        .Times(6);
-    EXPECT_CALL(journal, logError(A<const std::string&>())).Times(6);
+        // Expect ErrorLogging service to be called once to log a DBus error
+        MockErrorLogging& errorLogging = services.getMockErrorLogging();
+        EXPECT_CALL(errorLogging, logDBusError).Times(1);
+    };
 
-    // Expect ErrorLogging service to be called 1+1=2 times to log a DBus error
-    MockErrorLogging& errorLogging = services.getMockErrorLogging();
-    EXPECT_CALL(errorLogging, logDBusError).Times(2);
-
-    // Monitor sensors 5 times.  Should fail every time, write to journal 3
-    // times, and log one error.
-    for (int i = 1; i <= 5; ++i)
+    // Monitor sensors 10 times.  Verify errors logged.
     {
-        system.monitorSensors(services);
+        // Create mock services.  Set expectations via lambda.
+        MockServices services{};
+        setExpectations(services);
+
+        for (int i = 1; i <= 10; ++i)
+        {
+            system.monitorSensors(services);
+        }
     }
 
     // Clear error history
     system.clearErrorHistory();
 
-    // Monitor sensors 5 times again.  Should fail every time, write to journal
-    // 3 times, and log one error.
-    for (int i = 1; i <= 5; ++i)
+    // Monitor sensors 10 more times.  Verify errors logged again.
     {
-        system.monitorSensors(services);
+        // Create mock services.  Set expectations via lambda.
+        MockServices services{};
+        setExpectations(services);
+
+        for (int i = 1; i <= 10; ++i)
+        {
+            system.monitorSensors(services);
+        }
     }
 }
 
