diff --git a/src/test/java/ntnu/idatt2016/v233/SmartMat/controller/RecipeControllerTest.java b/src/test/java/ntnu/idatt2016/v233/SmartMat/controller/RecipeControllerTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..b6f4bbe962b64446a61ec7c7dbbb6adef0cc8ea2
--- /dev/null
+++ b/src/test/java/ntnu/idatt2016/v233/SmartMat/controller/RecipeControllerTest.java
@@ -0,0 +1,91 @@
+package ntnu.idatt2016.v233.SmartMat.controller;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import ntnu.idatt2016.v233.SmartMat.entity.Recipe;
+import ntnu.idatt2016.v233.SmartMat.service.RecipeService;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.junit.jupiter.MockitoExtension;
+import org.springframework.http.MediaType;
+import org.springframework.test.web.servlet.MockMvc;
+import org.springframework.test.web.servlet.setup.MockMvcBuilders;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Optional;
+
+import static org.mockito.Mockito.when;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
+
+@ExtendWith(MockitoExtension.class)
+public class RecipeControllerTest {
+
+    @Mock
+    private RecipeService recipeService;
+
+    @InjectMocks
+    private RecipeController recipeController;
+
+    private MockMvc mockMvc;
+    private ObjectMapper objectMapper;
+    private Recipe recipe1;
+    private Recipe recipe2;
+
+    @BeforeEach
+    void setUp() {
+        mockMvc = MockMvcBuilders.standaloneSetup(recipeController).build();
+        objectMapper = new ObjectMapper();
+
+        recipe1 = Recipe.builder()
+                .id(1L)
+                .name("Recipe 1")
+                .description("Recipe 1 description")
+                .build();
+
+        recipe2 = Recipe.builder()
+                .id(2L)
+                .name("Recipe 2")
+                .description("Recipe 2 description")
+                .build();
+    }
+
+    @Test
+    void getRecipeById() throws Exception {
+        when(recipeService.getRecipeById(recipe1.getId())).thenReturn(Optional.of(recipe1));
+
+        mockMvc.perform(get("/api/recipe/id/{id}", recipe1.getId()))
+                .andExpect(status().isOk())
+                .andExpect(content().json(objectMapper.writeValueAsString(recipe1)));
+    }
+
+    @Test
+    void getRecipeById_NotFound() throws Exception {
+        when(recipeService.getRecipeById(3L)).thenReturn(Optional.empty());
+
+        mockMvc.perform(get("/api/recipe/id/{id}", 3L))
+                .andExpect(status().isNotFound());
+    }
+
+    @Test
+    void getRecipeByName() throws Exception {
+        List<Recipe> recipes = Arrays.asList(recipe1, recipe2);
+        when(recipeService.getRecipesByName("Recipe")).thenReturn(recipes);
+
+        mockMvc.perform(get("/api/recipe/name/{name}", "Recipe"))
+                .andExpect(status().isOk())
+                .andExpect(content().json(objectMapper.writeValueAsString(recipes)));
+    }
+
+    @Test
+    void getRecipeByName_NotFound() throws Exception {
+        when(recipeService.getRecipesByName("Nonexistent")).thenReturn(List.of());
+
+        mockMvc.perform(get("/api/recipe/name/{name}", "Nonexistent"))
+                .andExpect(status().isNotFound());
+    }
+}
diff --git a/src/test/java/ntnu/idatt2016/v233/SmartMat/service/RecipeServiceTest.java b/src/test/java/ntnu/idatt2016/v233/SmartMat/service/RecipeServiceTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..49804be28b0eab657e76e17ecfe01a268be877be
--- /dev/null
+++ b/src/test/java/ntnu/idatt2016/v233/SmartMat/service/RecipeServiceTest.java
@@ -0,0 +1,122 @@
+package ntnu.idatt2016.v233.SmartMat.service;
+
+import ntnu.idatt2016.v233.SmartMat.entity.Recipe;
+import ntnu.idatt2016.v233.SmartMat.entity.user.User;
+import ntnu.idatt2016.v233.SmartMat.repository.RecipeRepository;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.junit.jupiter.MockitoExtension;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Optional;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.Mockito.*;
+
+@ExtendWith(MockitoExtension.class)
+public class RecipeServiceTest {
+
+    @Mock
+    private RecipeRepository recipeRepository;
+
+    @InjectMocks
+    private RecipeService recipeService;
+
+    private Recipe recipe1;
+    private Recipe recipe2;
+    private User user;
+
+    @BeforeEach
+    void setUp() {
+        recipe1 = Recipe.builder()
+                .id(1L)
+                .name("Recipe 1")
+                .description("Recipe 1 description")
+                .build();
+
+        recipe2 = Recipe.builder()
+                .id(2L)
+                .name("Recipe 2")
+                .description("Recipe 2 description")
+                .build();
+
+        user = new User();
+        user.setUsername("testuser");
+        user.setEmail("testuser@example.com");
+    }
+
+    @Test
+    void getRecipeById() {
+        when(recipeRepository.findById(recipe1.getId())).thenReturn(Optional.of(recipe1));
+
+        Optional<Recipe> result = recipeService.getRecipeById(recipe1.getId());
+
+        assertThat(result).isPresent();
+        assertThat(result.get()).isEqualTo(recipe1);
+        verify(recipeRepository).findById(recipe1.getId());
+    }
+
+    @Test
+    void getRecipesByName() {
+        List<Recipe> expectedRecipes = Arrays.asList(recipe1, recipe2);
+        when(recipeRepository.findAllByName(recipe1.getName())).thenReturn(expectedRecipes);
+
+        List<Recipe> result = recipeService.getRecipesByName(recipe1.getName());
+
+        assertThat(result).isEqualTo(expectedRecipes);
+        verify(recipeRepository).findAllByName(recipe1.getName());
+    }
+
+    @Test
+    void getAllRecipes() {
+        List<Recipe> expectedRecipes = Arrays.asList(recipe1, recipe2);
+        when(recipeRepository.findAll()).thenReturn(expectedRecipes);
+
+        List<Recipe> result = recipeService.getAllRecipes();
+
+        assertThat(result).isEqualTo(expectedRecipes);
+        verify(recipeRepository).findAll();
+    }
+
+    @Test
+    void saveRecipe() {
+        when(recipeRepository.save(recipe1)).thenReturn(recipe1);
+
+        Recipe result = recipeService.saveRecipe(recipe1);
+
+        assertThat(result).isEqualTo(recipe1);
+        verify(recipeRepository).save(recipe1);
+    }
+
+    @Test
+    void deleteRecipe() {
+        doNothing().when(recipeRepository).delete(recipe1);
+
+        recipeService.deleteRecipe(recipe1);
+
+        verify(recipeRepository).delete(recipe1);
+    }
+
+    @Test
+    void deleteRecipeById() {
+        doNothing().when(recipeRepository).deleteById(recipe1.getId());
+
+        recipeService.deleteRecipeById(recipe1.getId());
+
+        verify(recipeRepository).deleteById(recipe1.getId());
+    }
+
+    @Test
+    void addUserToRecipe() {
+        when(recipeRepository.save(recipe1)).thenReturn(recipe1);
+
+        recipeService.addUserToRecipe(recipe1, user);
+
+        assertThat(recipe1.getUsers()).contains(user);
+        verify(recipeRepository).save(recipe1);
+    }
+}