diff --git a/core/pom.xml b/core/pom.xml
index 240d9afd5a..2b99d712fa 100644
--- a/core/pom.xml
+++ b/core/pom.xml
@@ -135,6 +135,12 @@
             <scope>runtime</scope>
         </dependency>
 
+        <!-- Test -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-test</artifactId>
+            <scope>test</scope>
+        </dependency>
 
     </dependencies>
 
diff --git a/core/src/test/java/se/su/dsv/scipro/test/GuiceTest.java b/core/src/test/java/se/su/dsv/scipro/test/GuiceTest.java
index 6d2667ef5c..d10ba07747 100644
--- a/core/src/test/java/se/su/dsv/scipro/test/GuiceTest.java
+++ b/core/src/test/java/se/su/dsv/scipro/test/GuiceTest.java
@@ -1,67 +1,67 @@
 package se.su.dsv.scipro.test;
 
-import com.google.inject.AbstractModule;
-import com.google.inject.Guice;
-import com.google.inject.Injector;
+import com.google.common.eventbus.EventBus;
 import com.google.inject.Module;
-import com.google.inject.persist.PersistService;
-import com.google.inject.persist.UnitOfWork;
-import com.google.inject.persist.jpa.JpaPersistModule;
+import jakarta.inject.Provider;
 import jakarta.persistence.EntityManager;
+import jakarta.persistence.EntityManagerFactory;
 import jakarta.persistence.EntityTransaction;
+import jakarta.persistence.Persistence;
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.BeforeEach;
 
-import jakarta.inject.Inject;
-import jakarta.inject.Provider;
+import org.springframework.context.annotation.AnnotationConfigApplicationContext;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.FilterType;
+import se.su.dsv.scipro.forum.AbstractThreadRepositoryImpl;
+import se.su.dsv.scipro.grading.GradingHistory;
+import se.su.dsv.scipro.grading.GradingHistoryEventRepository;
+import se.su.dsv.scipro.oauth.OAuthSettings;
+import se.su.dsv.scipro.security.auth.LocalAuthentication;
+import se.su.dsv.scipro.sukat.Sukat;
+import se.su.dsv.scipro.system.CurrentUser;
+import se.su.dsv.scipro.system.PasswordService;
+import se.su.dsv.scipro.system.UserService;
+
 import java.time.Clock;
+import java.util.Optional;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
 
 public abstract class GuiceTest {
-    @Inject
-    private UnitOfWork unitOfWork;
-    @Inject
-    private PersistService persistService;
-    @Inject
-    private Provider<EntityManager> entityManager;
+    private EntityManager entityManager;
+    private EntityManagerFactory entityManagerFactory;
 
     @BeforeEach
     public final void prepareGuice() {
-        Injector injector = Guice.createInjector(
-                new JpaPersistModule("testPersistenceUnit"),
-                new AbstractModule() {
-                    @Override
-                    protected void configure() {
-                        final MutableFixedClock clock = new MutableFixedClock(Clock.systemDefaultZone());
-                        bind(Clock.class).toInstance(clock);
-                        bind(MutableFixedClock.class).toInstance(clock);
-                    }
-                },
-                moduleUnderTest());
-
-        // Have to start the PersistService and UnitOfWork manually since they are no longer
-        // automatically started as an EntityManager is injected
-        injector.getInstance(PersistService.class).start();
-        injector.getInstance(UnitOfWork.class).begin();
-
-        injector.injectMembers(this);
-
-        persistService.start();
-        EntityTransaction transaction = entityManager.get().getTransaction();
+        entityManagerFactory = Persistence.createEntityManagerFactory("testPersistenceUnit");
+        this.entityManager = entityManagerFactory.createEntityManager();
+        EntityTransaction transaction = entityManager.getTransaction();
         transaction.begin();
         transaction.setRollbackOnly();
+
+        AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext();
+        annotationConfigApplicationContext.register(TestContext.class);
+        annotationConfigApplicationContext.getBeanFactory()
+                .registerSingleton("entityManager", this.entityManager);
+        annotationConfigApplicationContext.refresh();
+        annotationConfigApplicationContext.getAutowireCapableBeanFactory()
+                .autowireBean(this);
     }
 
     protected abstract Module moduleUnderTest();
 
     @AfterEach
     public final void shutDownPersistence() {
-        entityManager.get().getTransaction().rollback();
-        unitOfWork.end();
-        persistService.stop();
+        entityManager.getTransaction().rollback();
+        entityManager.close();
+        entityManagerFactory.close();
     }
 
     protected <T> T save(T entity) {
-        EntityManager em = entityManager.get();
+        EntityManager em = entityManager;
         if (em.contains(entity)) {
             return em.merge(entity);
         }
@@ -70,4 +70,65 @@ public abstract class GuiceTest {
             return entity;
         }
     }
+
+    @Configuration(proxyBeanMethods = false)
+    @ComponentScan(
+            basePackages = "se.su.dsv.scipro",
+            includeFilters = @ComponentScan.Filter(type = FilterType.REGEX, pattern = ".*Impl$"),
+            excludeFilters = @ComponentScan.Filter(type = FilterType.REGEX, pattern = {
+                    ".*Abstract.*",
+                    ".*[Dd]aisy.*",
+                    ".*GradingServiceImpl"
+            }))
+    public static class TestContext {
+        @Bean
+        public EventBus eventBus() {
+            return new EventBus();
+        }
+
+        @Bean
+        public InMemoryFileStore inMemoryFileStore() {
+            return new InMemoryFileStore();
+        }
+
+        @Bean
+        public MutableFixedClock clock() {
+            return new MutableFixedClock(Clock.systemDefaultZone());
+        }
+
+        @Bean
+        public GradingHistory gradingHistory(GradingHistoryEventRepository gradingHistoryEventRepository) {
+            return new GradingHistory(gradingHistoryEventRepository);
+        }
+
+        @Bean
+        public AbstractThreadRepositoryImpl abstractThreadRepository(Provider<EntityManager> em) {
+            return new AbstractThreadRepositoryImpl(em);
+        }
+
+        @Bean
+        public OAuthSettings oAuthSettings() {
+            return new OAuthSettings("uri", "redirectUri", "clientId", "clientSecret");
+        }
+
+        @Bean
+        public Sukat sukat() {
+            return (username) -> Optional.empty();
+        }
+
+        @Bean
+        public ScheduledExecutorService scheduledExecutorService() {
+            return Executors.newSingleThreadScheduledExecutor();
+        }
+
+        @Bean
+        public CurrentUser currentUser() {
+            return () -> null;
+        }
+
+        @Bean
+        public LocalAuthentication localAuthentication(UserService userService, PasswordService passwordService) {
+            return new LocalAuthentication(userService, passwordService);
+        }
+    }
 }