diff --git a/library/phx/rendering/components/mesh_render_settings.cpp b/library/phx/rendering/components/mesh_render_settings.cpp
index 23e920fbe5fadbc1eb9ababd2f65ceff381e29b9..0a2907d581bad4d411c712ed357092391673441c 100644
--- a/library/phx/rendering/components/mesh_render_settings.cpp
+++ b/library/phx/rendering/components/mesh_render_settings.cpp
@@ -24,7 +24,7 @@
 
 namespace phx {
 
-MeshRenderSettings MeshRenderSettings::default_settings_;
+const MeshRenderSettings MeshRenderSettings::default_settings_;
 
 void MeshRenderSettings::SetWireframeMode(const bool enabled) {
   wireframe_mode_ = enabled;
@@ -32,7 +32,7 @@ void MeshRenderSettings::SetWireframeMode(const bool enabled) {
 
 bool MeshRenderSettings::GetWireframeMode() const { return wireframe_mode_; }
 
-MeshRenderSettings* MeshRenderSettings::GetDefault() {
+const MeshRenderSettings* MeshRenderSettings::GetDefault() {
   return &default_settings_;
 }
 
diff --git a/library/phx/rendering/components/mesh_render_settings.hpp b/library/phx/rendering/components/mesh_render_settings.hpp
index bb9fda67138831896974e1280f11af332883736c..b35f1710e2ba330fad793266883a2603bae5d593 100644
--- a/library/phx/rendering/components/mesh_render_settings.hpp
+++ b/library/phx/rendering/components/mesh_render_settings.hpp
@@ -36,12 +36,12 @@ class PHOENIX_EXPORT MeshRenderSettings final : public Component {
   void SetWireframeMode(bool enabled);
   bool GetWireframeMode() const;
 
-  static MeshRenderSettings* GetDefault();
+  static const MeshRenderSettings* GetDefault();
 
  private:
   bool wireframe_mode_ = false;
 
-  static MeshRenderSettings default_settings_;
+  static const MeshRenderSettings default_settings_;
 };
 }  // namespace phx
 
diff --git a/library/phx/rendering/render_passes/geometry_pass.cpp b/library/phx/rendering/render_passes/geometry_pass.cpp
index bd19d5ad84ab006d5371a4fa13a4da883324a7ba..434b0b0a6e91d04957279a1f8b31e21a1ee2bfdb 100644
--- a/library/phx/rendering/render_passes/geometry_pass.cpp
+++ b/library/phx/rendering/render_passes/geometry_pass.cpp
@@ -223,11 +223,15 @@ void GeometryPass::Draw(const RenderingInstance& rendering_instance) {
   SetTransformShaderUniforms(model_matrix, view_matrix, projection_matrix);
   SetMaterialShaderUniforms(rendering_instance.material);
 
+  const MeshRenderSettings* render_settings =
+      rendering_instance.mesh_render_settings;
+  if (render_settings == nullptr) {
+    render_settings = MeshRenderSettings::GetDefault();
+  }
+
   glEnable(GL_DEPTH_TEST);
   glPolygonMode(GL_FRONT_AND_BACK,
-                rendering_instance.mesh_render_settings->GetWireframeMode()
-                    ? GL_LINE
-                    : GL_FILL);
+                render_settings->GetWireframeMode() ? GL_LINE : GL_FILL);
   glDrawElements(
       GL_TRIANGLES,
       static_cast<GLsizei>(rendering_instance.mesh->GetIndices().size()),
@@ -293,7 +297,9 @@ void GeometryPass::SetLightShaderUniforms() {
   }
 }
 
-void GeometryPass::SetMaterialShaderUniforms(Material* material) {
+void GeometryPass::SetMaterialShaderUniforms(const Material* material) {
+  if (material == nullptr) material = Material::GetDefault();
+
   const glm::uvec4 texture_toggle =
       glm::uvec4(material->GetAmbientTexture() != nullptr ? 1u : 0u,
                  material->GetDiffuseTexture() != nullptr ? 1u : 0u,
diff --git a/library/phx/rendering/render_passes/geometry_pass.hpp b/library/phx/rendering/render_passes/geometry_pass.hpp
index 6e19b2dced1f36fe07fed6b8ebd9d5e412c233c3..15a0d2389159a0408c8f60b5381b30cdf28c1a8c 100644
--- a/library/phx/rendering/render_passes/geometry_pass.hpp
+++ b/library/phx/rendering/render_passes/geometry_pass.hpp
@@ -65,7 +65,7 @@ class PHOENIX_EXPORT GeometryPass : public RenderPass {
     Mesh* mesh = nullptr;
     Material* material = nullptr;
     Transform* transform = nullptr;
-    MeshRenderSettings* mesh_render_settings = MeshRenderSettings::GetDefault();
+    MeshRenderSettings* mesh_render_settings = nullptr;
   };
   struct RenderOffset {
     std::size_t vertex_offset;
@@ -124,7 +124,7 @@ class PHOENIX_EXPORT GeometryPass : public RenderPass {
                                   const glm::mat4& view_matrix,
                                   const glm::mat4& projection_matrix);
   void SetLightShaderUniforms();
-  void SetMaterialShaderUniforms(Material* material);
+  void SetMaterialShaderUniforms(const Material* material);
 
   std::unique_ptr<ShaderProgram> shader_program_;
 
diff --git a/library/phx/rendering/rendering_system.cpp b/library/phx/rendering/rendering_system.cpp
index 781dfb22b9e5bd7a8f48db8f538dd2223afe07ee..78362871ef1b8b0e84f38fe4b3e414d0d0c86fe2 100644
--- a/library/phx/rendering/rendering_system.cpp
+++ b/library/phx/rendering/rendering_system.cpp
@@ -75,18 +75,15 @@ void RenderingSystem::Update(const FrameTimer::TimeInfo&) {
     auto light = entity->GetFirstComponent<Light>();
     auto transform = entity->GetFirstComponent<Transform>();
     auto material_handle = entity->GetFirstComponent<MaterialHandle>();
+    Material* material = nullptr;
+    if (material_handle != nullptr)
+      material = material_handle->GetMaterial().Get();
     auto mesh_render_settings = entity->GetFirstComponent<MeshRenderSettings>();
 
     if (transform != nullptr) {
       if (mesh_handle != nullptr) {
-        rendering_instances.push_back(
-            {mesh_handle->GetMesh().Get(),
-             (material_handle != nullptr ? material_handle->GetMaterial().Get()
-                                         : Material::GetDefault()),
-             transform,
-             (mesh_render_settings != nullptr
-                  ? mesh_render_settings
-                  : MeshRenderSettings::GetDefault())});
+        rendering_instances.push_back({mesh_handle->GetMesh().Get(), material,
+                                       transform, mesh_render_settings});
       } else if (light != nullptr) {
         light_transform_pairs.push_back(
             std::pair<Light*, Transform*>(light, transform));
diff --git a/library/phx/resources/types/material.cpp b/library/phx/resources/types/material.cpp
index d8ab57d8337430dc32cff13da0723b9f2891d552..cf0b925a2b12089a464e9910b295ad9bf89fcf69 100644
--- a/library/phx/resources/types/material.cpp
+++ b/library/phx/resources/types/material.cpp
@@ -32,7 +32,7 @@
 namespace phx {
 
 const char Material::UNNAMED[] = "UnnamedMaterial";
-Material Material::default_material_;
+const Material Material::default_material_;
 
 glm::vec3 Material::GetDiffuseColor() const { return diffuse_color_; }
 void Material::SetDiffuseColor(glm::vec3 color) { diffuse_color_ = color; }
@@ -42,11 +42,10 @@ ResourcePointer<Image> Material::GetDiffuseImage() const {
 }
 void Material::SetDiffuseImage(ResourcePointer<Image> image) {
   diffuse_image_ = image;
+  SetTexture(diffuse_image_, &diffuse_texture_);
 }
 
-gl::texture_2d* Material::GetDiffuseTexture() {
-  if (diffuse_image_ && !diffuse_texture_)
-    SetTexture(diffuse_image_, &diffuse_texture_);
+gl::texture_2d* Material::GetDiffuseTexture() const {
   return diffuse_texture_.get();
 }
 
@@ -58,11 +57,10 @@ ResourcePointer<Image> Material::GetAmbientImage() const {
 }
 void Material::SetAmbientImage(ResourcePointer<Image> image) {
   ambient_image_ = image;
+  SetTexture(ambient_image_, &ambient_texture_);
 }
 
-gl::texture_2d* Material::GetAmbientTexture() {
-  if (ambient_image_ && !ambient_texture_)
-    SetTexture(ambient_image_, &ambient_texture_);
+gl::texture_2d* Material::GetAmbientTexture() const {
   return ambient_texture_.get();
 }
 
@@ -74,11 +72,10 @@ ResourcePointer<Image> Material::GetSpecularImage() const {
 }
 void Material::SetSpecularImage(ResourcePointer<Image> image) {
   specular_image_ = image;
+  SetTexture(specular_image_, &specular_texture_);
 }
 
-gl::texture_2d* Material::GetSpecularTexture() {
-  if (specular_image_ && !specular_texture_)
-    SetTexture(specular_image_, &specular_texture_);
+gl::texture_2d* Material::GetSpecularTexture() const {
   return specular_texture_.get();
 }
 
@@ -94,7 +91,7 @@ void Material::SetShininess(float shininess) {
   }
 }
 
-Material* Material::GetDefault() { return &default_material_; }
+const Material* Material::GetDefault() { return &default_material_; }
 
 void Material::SetTexture(ResourcePointer<Image> image,
                           std::shared_ptr<gl::texture_2d>* texture) {
diff --git a/library/phx/resources/types/material.hpp b/library/phx/resources/types/material.hpp
index 19565287ba3d72ec6240292708ba3fa43af00df4..ae74ee21dba19043c2478ae9a31cc2237e009b3b 100644
--- a/library/phx/resources/types/material.hpp
+++ b/library/phx/resources/types/material.hpp
@@ -62,29 +62,26 @@ class PHOENIX_EXPORT Material : public Resource, public Nameable {
 
   ResourcePointer<Image> GetDiffuseImage() const;
   void SetDiffuseImage(ResourcePointer<Image> image);
-
-  gl::texture_2d* GetDiffuseTexture();
+  gl::texture_2d* GetDiffuseTexture() const;
 
   glm::vec3 GetAmbientColor() const;
   void SetAmbientColor(glm::vec3 color);
 
   ResourcePointer<Image> GetAmbientImage() const;
   void SetAmbientImage(ResourcePointer<Image> image);
-
-  gl::texture_2d* GetAmbientTexture();
+  gl::texture_2d* GetAmbientTexture() const;
 
   glm::vec3 GetSpecularColor() const;
   void SetSpecularColor(glm::vec3 color);
 
   ResourcePointer<Image> GetSpecularImage() const;
   void SetSpecularImage(ResourcePointer<Image> image);
-
-  gl::texture_2d* GetSpecularTexture();
+  gl::texture_2d* GetSpecularTexture() const;
 
   float GetShininess() const;
   void SetShininess(float shininess);
 
-  static Material* GetDefault();
+  static const Material* GetDefault();
 
  private:
   void SetTexture(ResourcePointer<Image> image,
@@ -101,7 +98,7 @@ class PHOENIX_EXPORT Material : public Resource, public Nameable {
   glm::vec3 specular_color_ = glm::vec3(1, 1, 1);
   float shininess_ = 64.0f;
 
-  static Material default_material_;
+  static const Material default_material_;
 };
 
 }  // namespace phx
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
index 7a9d51630e5abc3d55fc600d163802bf5d3266ed..6ac65f1e982407444b995f656237e82cf2edbdab 100644
--- a/tests/CMakeLists.txt
+++ b/tests/CMakeLists.txt
@@ -228,6 +228,9 @@ add_mocked_test(test_display_system MOCK_SDL)
 add_mocked_test(test_engine MOCK_SDL MOCK_OPENVR MOCK_GLEW)
 add_mocked_test(test_tracking_system MOCK_SDL MOCK_OPENVR)
 add_mocked_test(test_openvr_controller_system MOCK_SDL MOCK_OPENVR MOCK_GLEW)
+add_mocked_test(test_assimp_loader MOCK_GLEW)
+add_mocked_test(test_model MOCK_GLEW)
+add_mocked_test(test_scene_loader MOCK_GLEW)
 
 add_mocked_test(integration_test_model_rendering MOCK_OPENVR)
 add_mocked_test(integration_test_opengl_buffer_data_download MOCK_OPENVR)
diff --git a/tests/src/test_assimp_loader.cpp b/tests/src/test_assimp_loader.cpp
index 16626f0aa7b5c5dc8cf2f39d99cee75eea8f4fc9..a185d9a13ff1ec129b0e2309b6f575e4a416978a 100644
--- a/tests/src/test_assimp_loader.cpp
+++ b/tests/src/test_assimp_loader.cpp
@@ -26,14 +26,18 @@
 
 #include "catch/catch.hpp"
 
+#include "opengl_mock.hpp"
+
 #include "phx/core/logger.hpp"
-#include "phx/resources/types/mesh.hpp"
 #include "phx/resources/loaders/assimp_model_loader.hpp"
 #include "phx/resources/resource_utils.hpp"
+#include "phx/resources/types/mesh.hpp"
 #include "phx/utility/aspects/nameable.hpp"
 
 #include "test_utilities/log_capture.hpp"
 
+extern template struct trompeloeil::reporter<trompeloeil::specialized>;
+
 class TestLogger {
  public:
   TestLogger() : log_capture_{std::make_shared<test_utilities::LogCapture>()} {
@@ -49,6 +53,7 @@ class TestLogger {
 
 SCENARIO("The assimp loader loads models using the Assimp library.",
          "[phx][phx::AssimpLoader]") {
+  OPENGL_MOCK_ALLOW_ANY_CALL
   GIVEN("A plain loader") {
     phx::CreateDefaultLogger();
     TestLogger test_logger;
diff --git a/tests/src/test_model.cpp b/tests/src/test_model.cpp
index 7098d7ca52f01c7dec6872d7a815ff80aee976b3..09f34849768f9832ed066b3a9b7f726c2e8fe750 100644
--- a/tests/src/test_model.cpp
+++ b/tests/src/test_model.cpp
@@ -25,12 +25,18 @@
 #include "catch/catch.hpp"
 
 #include "phx/resources/loaders/assimp_model_loader.hpp"
-#include "phx/resources/types/model.hpp"
 #include "phx/resources/resource_manager.hpp"
 #include "phx/resources/resource_utils.hpp"
+#include "phx/resources/types/model.hpp"
+
+#include "opengl_mock.hpp"
+#include "trompeloeil.hpp"
+
+extern template struct trompeloeil::reporter<trompeloeil::specialized>;
 
 SCENARIO("A Model can be loaded that contains multiple meshes",
          "[phx][phx::Model]") {
+  OPENGL_MOCK_ALLOW_ANY_CALL
   GIVEN("A fresh resource manager...") {
     GIVEN("A file name of an .obj file...") {
       std::string model_file_name{"models/2MeshTest/2meshTest.obj"};
diff --git a/tests/src/test_scene_loader.cpp b/tests/src/test_scene_loader.cpp
index 1e69d84c692c57071f22d50d69d4df46bfe838d0..780692390eb89ac3b31bcea261771fe7d87d3f46 100644
--- a/tests/src/test_scene_loader.cpp
+++ b/tests/src/test_scene_loader.cpp
@@ -30,7 +30,13 @@
 #include "phx/rendering/components/transform.hpp"
 #include "phx/resources/loaders/scene_loader.hpp"
 
+#include "opengl_mock.hpp"
+#include "trompeloeil.hpp"
+
+extern template struct trompeloeil::reporter<trompeloeil::specialized>;
+
 SCENARIO("The scene loader can load a model", "[phx][phx::SceneLoader]") {
+  OPENGL_MOCK_ALLOW_ANY_CALL
   GIVEN("An empty scene") {
     phx::Scene scene;
     WHEN("We load a model into the scene") {