diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,5 +1,9 @@
 # Revision history for seakale-tests
 
+## 0.1.1.0  -- 2017-07-24
+
+* Add mockSave and mockFailingSave
+
 ## 0.1.0.2  -- 2017-03-08
 
 * Make (StoreMock a) an instance of Show so Mock (StoreMock backend) a is too.
diff --git a/seakale-tests.cabal b/seakale-tests.cabal
--- a/seakale-tests.cabal
+++ b/seakale-tests.cabal
@@ -1,5 +1,5 @@
 name:                  seakale-tests
-version:               0.1.0.2
+version:               0.1.1.0
 synopsis:              Helpers to test code using Seakale
 description:           This package provides a way to run code written with Seakale with a fake database using mocks.
 license:               BSD3
@@ -14,7 +14,7 @@
 source-repository head
   type:                darcs
   location:            http://darcs.redspline.com/seakale
-  tag:                 seakale-tests-0.1.0.2
+  tag:                 seakale-tests-0.1.1.0
 
 library
   ghc-options:         -Wall
@@ -30,6 +30,8 @@
                        TupleSections
                        OverloadedStrings
                        ExistentialQuantification
+                       ScopedTypeVariables
+                       RecordWildCards
 
   exposed-modules:     Database.Seakale.Tests.Mock
                        Database.Seakale.Tests.Request
diff --git a/src/Database/Seakale/Tests/Store.hs b/src/Database/Seakale/Tests/Store.hs
--- a/src/Database/Seakale/Tests/Store.hs
+++ b/src/Database/Seakale/Tests/Store.hs
@@ -22,6 +22,8 @@
   , mockUpdate
   , mockFailingUpdateMany
   , mockFailingUpdate
+  , mockSave
+  , mockFailingSave
   , mockDeleteMany
   , mockDelete
   , mockFailingDeleteMany
@@ -43,6 +45,7 @@
 import           Control.Monad.Trans.Free
 import qualified Control.Monad.Except as E
 
+import           Data.Maybe
 import           Data.Monoid
 import           Data.Typeable
 import qualified Data.ByteString.Lazy.Char8 as BSL
@@ -177,6 +180,24 @@
                   => EntityID a -> UpdateSetter backend a -> SeakaleError
                   -> Mock (StoreMock backend) ()
 mockFailingUpdate i setter = mockFailingUpdateMany setter (EntityID ==. i)
+
+mockSave :: ( Storable backend k l a, ToRow backend k (EntityID a)
+            , ToRow backend l a ) => EntityID a -> a
+         -> Mock (StoreMock backend) ()
+mockSave i val = mockUpdate i (mockSaveHelper val)
+
+mockFailingSave :: ( Storable backend k l a, ToRow backend k (EntityID a)
+                   , ToRow backend l a ) => EntityID a -> a -> SeakaleError
+                -> Mock (StoreMock backend) ()
+mockFailingSave i val = mockFailingUpdate i (mockSaveHelper val)
+
+mockSaveHelper :: forall backend k l a.
+                  ( Storable backend k l a, ToRow backend k (EntityID a)
+                  , ToRow backend l a ) => a -> UpdateSetter backend a
+mockSaveHelper val = UpdateSetter $ \backend ->
+  let Relation{..} = (relation backend :: Relation backend k l a)
+      row          = fmap (fromMaybe "NULL") $ toRow backend val
+  in vzip relationColumns row
 
 mockDeleteMany :: Storable backend k l a => Condition backend a -> Integer
                -> Mock (StoreMock backend) ()
