diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,6 +1,10 @@
-## [_Unreleased_](https://github.com/freckle/freckle-app/compare/v1.0.2.1...main)
+## [_Unreleased_](https://github.com/freckle/freckle-app/compare/v1.0.2.2...main)
 
 - None.
+
+## [v1.0.2.2](https://github.com/freckle/freckle-app/compare/v1.0.2.1...v1.0.2.2)
+
+- Target `hspec-junit-formatter-1.0.3.0` (use `1.1.0.0` in development)
 
 ## [v1.0.2.1](https://github.com/freckle/freckle-app/compare/v1.0.2.0...v1.0.2.1)
 
diff --git a/freckle-app.cabal b/freckle-app.cabal
--- a/freckle-app.cabal
+++ b/freckle-app.cabal
@@ -1,6 +1,6 @@
 cabal-version:      1.12
 name:               freckle-app
-version:            1.0.2.1
+version:            1.0.2.2
 license:            MIT
 license-file:       LICENSE
 maintainer:         Freckle Education
@@ -61,14 +61,14 @@
         TypeApplications TypeFamilies
 
     build-depends:
-        Glob >=0.10.1,
+        Glob >=0.10.2,
         MonadRandom >=0.5.3,
         aeson >=1.5.6.0,
         ansi-terminal >=0.11,
-        base >=4.14.1.0 && <5,
+        base >=4.14.3.0 && <5,
         bytestring >=0.10.12.0,
         case-insensitive >=1.2.1.0,
-        conduit >=1.3.4.1,
+        conduit >=1.3.4.2,
         data-default >=0.7.1.1,
         datadog >=0.2.5.0,
         doctest >=0.17,
@@ -77,44 +77,44 @@
         exceptions >=0.10.4,
         fast-logger >=3.0.5,
         filepath >=1.4.2.1,
-        hspec >=2.7.10,
-        hspec-core >=2.7.10,
+        hspec >=2.9.3,
+        hspec-core >=2.9.3,
         hspec-expectations-lifted >=0.10.0,
-        hspec-junit-formatter >=1.0.0.5,
+        hspec-junit-formatter >=1.1.0.0,
         http-client >=0.6.4.1,
         http-conduit >=2.3.8,
-        http-link-header >=1.2.0,
+        http-link-header >=1.2.1,
         http-types >=0.12.3,
         immortal >=0.3,
-        iproute >=1.7.11,
+        iproute >=1.7.12,
         lens >=4.19.2,
         load-env >=0.2.1.0,
-        monad-control >=1.0.2.3,
+        monad-control >=1.0.3.1,
         monad-logger >=0.3.36,
         mtl >=2.2.2,
         network >=3.1.1.1,
         network-uri >=2.6.4.1,
-        persistent >=2.13.1.1,
-        persistent-postgresql >=2.13.0.3,
+        persistent >=2.13.2.1,
+        persistent-postgresql >=2.13.2.1,
         postgresql-simple >=0.6.4,
-        primitive >=0.7.1.0,
-        process >=1.6.9.0,
+        primitive >=0.7.3.0,
+        process >=1.6.13.2,
         resource-pool >=0.2.3.2,
         retry >=0.8.1.2,
-        rio >=0.1.20.0,
+        rio >=0.1.21.0,
         template-haskell >=2.16.0.0,
         text >=1.2.4.1,
         time >=1.9.3,
         transformers >=0.5.6.2,
-        transformers-base >=0.4.5.2,
-        unliftio >=0.2.18,
+        transformers-base >=0.4.6,
+        unliftio >=0.2.20,
         unliftio-core >=0.2.0.1,
-        unordered-containers >=0.2.14.0,
+        unordered-containers >=0.2.15.0,
         wai >=3.2.3,
-        wai-extra >=3.1.6,
-        yaml >=0.11.5.0,
+        wai-extra >=3.1.7,
+        yaml >=0.11.7.0,
         yesod >=1.6.1.2,
-        yesod-core >=1.6.20.2
+        yesod-core >=1.6.21.0
 
 test-suite doctest
     type:               exitcode-stdio-1.0
@@ -132,7 +132,7 @@
         TypeApplications TypeFamilies
 
     build-depends:
-        base >=4.14.1.0 && <5,
+        base >=4.14.3.0 && <5,
         freckle-app -any
 
 test-suite gittest
@@ -155,11 +155,11 @@
         TypeApplications TypeFamilies
 
     build-depends:
-        base >=4.14.1.0 && <5,
+        base >=4.14.3.0 && <5,
         directory >=1.3.6.0,
         freckle-app -any,
-        hspec >=2.7.10,
-        process >=1.6.9.0,
+        hspec >=2.9.3,
+        process >=1.6.13.2,
         temporary >=1.3,
         text >=1.2.4.1,
         time >=1.9.3
@@ -193,12 +193,12 @@
     ghc-options:        -threaded -rtsopts -with-rtsopts=-N
     build-depends:
         aeson >=1.5.6.0,
-        base >=4.14.1.0 && <5,
+        base >=4.14.3.0 && <5,
         bytestring >=0.10.12.0,
         freckle-app -any,
-        hspec >=2.7.10,
+        hspec >=2.9.3,
         http-types >=0.12.3,
         lens >=4.19.2,
-        lens-aeson >=1.1.1,
+        lens-aeson >=1.1.3,
         wai >=3.2.3,
-        wai-extra >=3.1.6
+        wai-extra >=3.1.7
diff --git a/library/Freckle/App/Test/Hspec/Runner.hs b/library/Freckle/App/Test/Hspec/Runner.hs
--- a/library/Freckle/App/Test/Hspec/Runner.hs
+++ b/library/Freckle/App/Test/Hspec/Runner.hs
@@ -3,8 +3,7 @@
   , runParConfig
   , runWith
   , makeParallelConfig
-  )
-where
+  ) where
 
 import Prelude
 
@@ -14,12 +13,15 @@
 import Control.Monad.Trans.Maybe (MaybeT(MaybeT), runMaybeT)
 import Data.List (isInfixOf)
 import Data.Maybe (fromMaybe, isJust)
+import Data.Text (pack)
 import System.Environment (getArgs, lookupEnv)
-import Test.HSpec.JUnit (runJUnitSpec)
 import Test.Hspec (Spec)
+import Test.Hspec.JUnit
+  (configWithJUnit, defaultJUnitConfig, setJUnitConfigOutputFile)
 import Test.Hspec.Runner
   ( Config
   , Path
+  , Summary
   , configConcurrentJobs
   , configSkipPredicate
   , defaultConfig
@@ -64,6 +66,14 @@
     (spec `runJUnitSpec` ("/tmp/junit", filename)) . changeConfig
   hspec _ changeConfig = runSpec spec . changeConfig
   noConcurrency x = x { configConcurrentJobs = Just 1 }
+
+runJUnitSpec :: Spec -> (FilePath, String) -> Config -> IO Summary
+runJUnitSpec spec (path, name) config =
+  spec `runSpec` configWithJUnit junitConfig config
+ where
+  filePath = path <> "/" <> name <> "/test_results.xml"
+  junitConfig =
+    setJUnitConfigOutputFile filePath $ defaultJUnitConfig $ pack name
 
 makeParallelConfig :: Config -> IO Config
 makeParallelConfig config = do
diff --git a/package.yaml b/package.yaml
--- a/package.yaml
+++ b/package.yaml
@@ -1,6 +1,6 @@
 ---
 name: freckle-app
-version: 1.0.2.1
+version: 1.0.2.2
 maintainer: Freckle Education
 category: Utils
 github: freckle/freckle-app
