diff --git a/pom.xml b/pom.xml
index d23aeb7..005240e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -50,6 +50,13 @@
org.springframework.boot
spring-boot-starter-validation
+
+
+ com.h2database
+ h2
+ test
+
+
diff --git a/src/main/java/com/example/demo/student/StudentService.java b/src/main/java/com/example/demo/student/StudentService.java
index 282e376..5bd5791 100644
--- a/src/main/java/com/example/demo/student/StudentService.java
+++ b/src/main/java/com/example/demo/student/StudentService.java
@@ -3,6 +3,7 @@
import com.example.demo.student.exception.BadRequestException;
import com.example.demo.student.exception.StudentNotFoundException;
import lombok.AllArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.ResponseStatus;
diff --git a/src/test/java/com/example/demo/student/StudentRepositoryTest.java b/src/test/java/com/example/demo/student/StudentRepositoryTest.java
new file mode 100644
index 0000000..eb46625
--- /dev/null
+++ b/src/test/java/com/example/demo/student/StudentRepositoryTest.java
@@ -0,0 +1,48 @@
+package com.example.demo.student;
+
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+@DataJpaTest
+class StudentRepositoryTest {
+
+ @Autowired
+ StudentRepository underTest;
+
+ @AfterEach
+ void tearDown() {
+ underTest.deleteAll();
+ }
+
+ @Test
+ void shouldExistStudentsEmail() {
+
+ String email = "fathiamir37@gmail.com";
+ Student student = new Student("amir"
+ , email
+ , Gender.MALE);
+
+ underTest.save(student);
+ boolean result = underTest.selectExistsEmail(email);
+ assertTrue(result);
+ }
+
+ @Test
+ void shouldNotExistStudentsEmail() {
+
+ String email = "fathiamir37@gmail.com";
+ String email2 = "test@gmail.com";
+ Student student = new Student("amir"
+ , email
+ , Gender.MALE);
+
+ underTest.save(student);
+ boolean result = underTest.selectExistsEmail(email2);
+ assertFalse(result);
+ }
+
+}
\ No newline at end of file
diff --git a/src/test/java/com/example/demo/student/StudentServiceTest.java b/src/test/java/com/example/demo/student/StudentServiceTest.java
new file mode 100644
index 0000000..2def53d
--- /dev/null
+++ b/src/test/java/com/example/demo/student/StudentServiceTest.java
@@ -0,0 +1,108 @@
+package com.example.demo.student;
+
+import com.example.demo.student.exception.BadRequestException;
+import com.example.demo.student.exception.StudentNotFoundException;
+import net.bytebuddy.matcher.ElementMatchers;
+import org.assertj.core.api.Assertions;
+import org.hamcrest.CoreMatchers;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Disabled;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.ArgumentMatchers;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.junit.jupiter.MockitoExtension;
+
+import java.util.Arrays;
+import java.util.List;
+
+import static org.mockito.Mockito.*;
+
+@ExtendWith(MockitoExtension.class)
+class StudentServiceTest {
+
+ @Mock
+ private StudentRepository studentRepository;
+ private StudentService underTest;
+ private Student student;
+
+ @BeforeEach
+ void setUp() {
+ underTest = new StudentService(studentRepository);
+ student = new Student("amir", "fathiamir37@gmail.com", Gender.MALE);
+ }
+
+
+ @Test
+ void canGetAllStudents() {
+ // Arrange
+ List studentList = Arrays.asList(
+ new Student("amir", "fathiamir37@gmail.com", Gender.MALE),
+ new Student("sara", "saraamir37@gmail.com", Gender.FEMALE));
+ when(studentRepository.findAll()).thenReturn(studentList);
+
+ // Act
+ List allStudents = underTest.getAllStudents();
+
+ // Assert
+ Assertions.assertThat(studentList.size()).isEqualTo(allStudents.size());
+
+ // Verify
+ Mockito.verify(studentRepository).findAll();
+ }
+
+ @Test
+ void shouldAddStudent() {
+
+ underTest.addStudent(student);
+
+ ArgumentCaptor studentArgumentCaptor = ArgumentCaptor.forClass(Student.class);
+
+ Mockito.verify(studentRepository).save(studentArgumentCaptor.capture());
+
+ Student value = studentArgumentCaptor.getValue();
+
+ Assertions.assertThat(value).isEqualTo(student);
+
+
+ }
+
+ @Test
+ void shouldGetExceptionWhenAddingStudent() {
+
+ when(studentRepository.selectExistsEmail(ArgumentMatchers.any())).thenReturn(true);
+
+ Assertions.assertThatThrownBy(() -> underTest.addStudent(student))
+ .isInstanceOfAny(BadRequestException.class);
+ Mockito.verify(studentRepository, Mockito.never()).save(ArgumentMatchers.any());
+ }
+
+ @Test
+ void shouldBeAbleToDeleteStudent() {
+ Long studentId = 1L;
+
+ when(studentRepository.existsById(studentId)).thenReturn(true);
+
+ underTest.deleteStudent(studentId);
+
+ verify(studentRepository, times(1)).deleteById(studentId);
+
+ }
+
+ @Test
+ void shouldGetExceptionWhenDeleteStudent() {
+
+ when(studentRepository
+ .existsById(ArgumentMatchers.any()))
+ .thenReturn(false);
+
+ Assertions
+ .assertThatThrownBy(() -> underTest.deleteStudent(121L))
+ .isInstanceOf(StudentNotFoundException.class);
+
+ Mockito
+ .verify(studentRepository, Mockito.never()).deleteById(ArgumentMatchers.any());
+ }
+}
\ No newline at end of file
diff --git a/src/test/resources/application.properties b/src/test/resources/application.properties
new file mode 100644
index 0000000..c1c8fa7
--- /dev/null
+++ b/src/test/resources/application.properties
@@ -0,0 +1,7 @@
+spring.datasource.driverClassName=org.h2.Driver
+spring.datasource.url=jdbc:h2:mem:testdb
+spring.datasource.username=sa
+spring.datasource.password=
+spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
+spring.jpa.hibernate.ddl-auto=create-drop
+spring.jpa.show-sql=true