diff --git a/applications/test/testFunctionObjects/Make/files b/applications/test/testFunctionObjects/Make/files
new file mode 100644
index 0000000000..618eaa1dd4
--- /dev/null
+++ b/applications/test/testFunctionObjects/Make/files
@@ -0,0 +1,3 @@
+fakeError/fakeErrorFunctionObject.C
+
+LIB = $(FOAM_USER_LIBBIN)/libtestFunctionObjects
diff --git a/applications/test/testFunctionObjects/Make/options b/applications/test/testFunctionObjects/Make/options
new file mode 100644
index 0000000000..6b8588463d
--- /dev/null
+++ b/applications/test/testFunctionObjects/Make/options
@@ -0,0 +1,2 @@
+/* EXE_INC = */
+/* LIB_LIBS = */
diff --git a/applications/test/testFunctionObjects/fakeError/fakeErrorFunctionObject.C b/applications/test/testFunctionObjects/fakeError/fakeErrorFunctionObject.C
new file mode 100644
index 0000000000..9dda6a4a42
--- /dev/null
+++ b/applications/test/testFunctionObjects/fakeError/fakeErrorFunctionObject.C
@@ -0,0 +1,146 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration |
+ \\ / A nd | www.openfoam.com
+ \\/ M anipulation |
+-------------------------------------------------------------------------------
+ Copyright (C) 2020 OpenCFD Ltd.
+-------------------------------------------------------------------------------
+License
+ This file is part of OpenFOAM.
+
+ OpenFOAM is free software: you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with OpenFOAM. If not, see .
+
+\*---------------------------------------------------------------------------*/
+
+#include "fakeErrorFunctionObject.H"
+#include "addToRunTimeSelectionTable.H"
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace functionObjects
+{
+ defineTypeNameAndDebug(fakeErrorFunctionObject, 0);
+ addToRunTimeSelectionTable
+ (
+ functionObject,
+ fakeErrorFunctionObject,
+ dictionary
+ );
+}
+}
+
+
+// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
+
+void Foam::functionObjects::fakeErrorFunctionObject::emitError
+(
+ const char* what
+) const
+{
+
+ if (ioError_)
+ {
+ FatalIOError
+ << "Error on " << what << " : " << name() << nl
+ << exit(FatalIOError);
+ }
+ else
+ {
+ FatalError
+ << "Error on " << what << " : " << name() << nl
+ << exit(FatalError);
+ }
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
+
+Foam::functionObjects::fakeErrorFunctionObject::fakeErrorFunctionObject
+(
+ const word& name,
+ const Time& runTime,
+ const dictionary& dict
+)
+:
+ timeFunctionObject(name, runTime),
+ ioError_(false),
+ constructError_(false),
+ executeError_(false),
+ writeError_(false)
+{
+ read(dict);
+
+ if (constructError_)
+ {
+ emitError("construct");
+ }
+}
+
+
+// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
+
+bool Foam::functionObjects::fakeErrorFunctionObject::read
+(
+ const dictionary& dict
+)
+{
+ functionObject::read(dict);
+
+ ioError_ = false;
+ constructError_ = false;
+ executeError_ = false;
+ writeError_ = false;
+
+ dict.readIfPresent("ioError", ioError_);
+ dict.readIfPresent("constructError", constructError_);
+ dict.readIfPresent("executeError", executeError_);
+ dict.readIfPresent("writeError", writeError_);
+
+ Log << "Reading : " << name() << nl
+ << " error on construct " << constructError_ << nl
+ << " error on execute() " << executeError_ << nl
+ << " error on write() " << writeError_ << nl
+ << " using ioerror = " << ioError_ << nl;
+
+ return true;
+}
+
+
+bool Foam::functionObjects::fakeErrorFunctionObject::execute()
+{
+ if (executeError_)
+ {
+ emitError("execute()");
+ }
+
+ return true;
+}
+
+
+bool Foam::functionObjects::fakeErrorFunctionObject::write()
+{
+ if (writeError_)
+ {
+ emitError("write()");
+ }
+
+ return true;
+}
+
+
+// ************************************************************************* //
diff --git a/applications/test/testFunctionObjects/fakeError/fakeErrorFunctionObject.H b/applications/test/testFunctionObjects/fakeError/fakeErrorFunctionObject.H
new file mode 100644
index 0000000000..84c6479bf1
--- /dev/null
+++ b/applications/test/testFunctionObjects/fakeError/fakeErrorFunctionObject.H
@@ -0,0 +1,147 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration |
+ \\ / A nd | www.openfoam.com
+ \\/ M anipulation |
+-------------------------------------------------------------------------------
+ Copyright (C) 2020 OpenCFD Ltd.
+-------------------------------------------------------------------------------
+License
+ This file is part of OpenFOAM.
+
+ OpenFOAM is free software: you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with OpenFOAM. If not, see .
+
+Class
+ Foam::functionObjects::fakeErrorFunctionObject
+
+Description
+ A function object that emits FatalError at different stages
+ (or does nothing), which is useful for testing purposes.
+
+ Can request errors from constructor, execute and write methods.
+
+Usage
+ Example of function object specification:
+
+ \verbatim
+ test
+ {
+ type fakeError;
+ libs (testFunctionObjects);
+ ...
+ errors warn;
+ executeError true;
+ }
+ \endverbatim
+
+ Where the entries comprise:
+ \table
+ Property | Description | Reqd | Deflt
+ ioError | FatalIOError instead of FatalError | no | no
+ constructError | generate error on construct | no | no
+ executeError | generate error on execute() | no | no
+ writeError | generate error on write() | no | no
+ \endtable
+
+SourceFiles
+ fakeErrorFunctionObject.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef functionObjects_fakeErrorFunctionObject_H
+#define functionObjects_fakeErrorFunctionObject_H
+
+#include "timeFunctionObject.H"
+#include "Switch.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace functionObjects
+{
+
+/*---------------------------------------------------------------------------*\
+ Class fakeErrorFunctionObject Declaration
+\*---------------------------------------------------------------------------*/
+
+class fakeErrorFunctionObject
+:
+ public timeFunctionObject
+{
+ // Private Data
+
+ Switch ioError_;
+ Switch constructError_;
+ Switch executeError_;
+ Switch writeError_;
+
+
+ // Private Member Functions
+
+ //- Emit error for whatever
+ void emitError(const char* what) const;
+
+ //- No copy construct
+ fakeErrorFunctionObject(const fakeErrorFunctionObject&) = delete;
+
+ //- No copy assignment
+ void operator=(const fakeErrorFunctionObject&) = delete;
+
+
+public:
+
+ //- Runtime type information
+ TypeName("fakeError");
+
+
+ // Constructors
+
+ //- Construct from Time and dictionary
+ fakeErrorFunctionObject
+ (
+ const word& name,
+ const Time& runTime,
+ const dictionary& dict
+ );
+
+
+ //- Destructor
+ virtual ~fakeErrorFunctionObject() = default;
+
+
+ // Member Functions
+
+ //- Read and report settings
+ virtual bool read(const dictionary& dict);
+
+ //- Execute. Emit error or do nothing.
+ virtual bool execute();
+
+ //- Write. Emit error or do nothing.
+ virtual bool write();
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace functionObjects
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //