diff --git a/spring-boot/spring-boot-testing/build.gradle b/spring-boot/spring-boot-testing/build.gradle index 7745f47..4723377 100644 --- a/spring-boot/spring-boot-testing/build.gradle +++ b/spring-boot/spring-boot-testing/build.gradle @@ -31,4 +31,5 @@ dependencies { runtime('com.h2database:h2') testCompile('org.springframework.boot:spring-boot-starter-test') testCompile 'org.junit.jupiter:junit-jupiter-engine:5.2.0' + testCompile('org.mockito:mockito-junit-jupiter:2.23.0') } diff --git a/spring-boot/spring-boot-testing/src/main/java/io/reflectoring/testing/RegisterUseCase.java b/spring-boot/spring-boot-testing/src/main/java/io/reflectoring/testing/RegisterUseCase.java new file mode 100644 index 0000000..dc2bba3 --- /dev/null +++ b/spring-boot/spring-boot-testing/src/main/java/io/reflectoring/testing/RegisterUseCase.java @@ -0,0 +1,19 @@ +package io.reflectoring.testing; + +import java.time.LocalDateTime; + +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class RegisterUseCase { + + private final UserRepository userRepository; + + public User registerUser(User user) { + user.setRegistrationDate(LocalDateTime.now()); + return userRepository.save(user); + } + +} diff --git a/spring-boot/spring-boot-testing/src/main/java/io/reflectoring/testing/User.java b/spring-boot/spring-boot-testing/src/main/java/io/reflectoring/testing/User.java new file mode 100644 index 0000000..d1bc6d7 --- /dev/null +++ b/spring-boot/spring-boot-testing/src/main/java/io/reflectoring/testing/User.java @@ -0,0 +1,26 @@ +package io.reflectoring.testing; + +import javax.persistence.Entity; +import javax.persistence.Id; + +import java.time.LocalDateTime; + +import lombok.AllArgsConstructor; +import lombok.Data; + +@Entity +@Data +@AllArgsConstructor +public class User { + + @Id + private Long id; + private String name; + private String email; + private LocalDateTime registrationDate; + + public User(String name, String email) { + this.name = name; + this.email = email; + } +} diff --git a/spring-boot/spring-boot-testing/src/main/java/io/reflectoring/testing/UserRepository.java b/spring-boot/spring-boot-testing/src/main/java/io/reflectoring/testing/UserRepository.java new file mode 100644 index 0000000..a6a599e --- /dev/null +++ b/spring-boot/spring-boot-testing/src/main/java/io/reflectoring/testing/UserRepository.java @@ -0,0 +1,7 @@ +package io.reflectoring.testing; + + +import org.springframework.data.repository.CrudRepository; + +public interface UserRepository extends CrudRepository { +} diff --git a/spring-boot/spring-boot-testing/src/test/java/io/reflectoring/testing/RegisterUseCaseTest.java b/spring-boot/spring-boot-testing/src/test/java/io/reflectoring/testing/RegisterUseCaseTest.java new file mode 100644 index 0000000..7ae7076 --- /dev/null +++ b/spring-boot/spring-boot-testing/src/test/java/io/reflectoring/testing/RegisterUseCaseTest.java @@ -0,0 +1,34 @@ +package io.reflectoring.testing; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; +import static io.reflectoring.testing.UserAssert.assertThat; +import static org.mockito.AdditionalAnswers.*; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.*; + +@ExtendWith(MockitoExtension.class) +class RegisterUseCaseTest { + + @Mock + private UserRepository userRepository; + + private RegisterUseCase registerUseCase; + + @BeforeEach + void initUseCase() { + registerUseCase = new RegisterUseCase(userRepository); + } + + @Test + void savedUserHasRegistrationDate() { + User user = new User("zaphod", "zaphod@mail.com"); + when(userRepository.save(any(User.class))).then(returnsFirstArg()); + User savedUser = registerUseCase.registerUser(user); + assertThat(savedUser).hasRegistrationDate(); + } + +} \ No newline at end of file diff --git a/spring-boot/spring-boot-testing/src/test/java/io/reflectoring/testing/UserAssert.java b/spring-boot/spring-boot-testing/src/test/java/io/reflectoring/testing/UserAssert.java new file mode 100644 index 0000000..0ebc952 --- /dev/null +++ b/spring-boot/spring-boot-testing/src/test/java/io/reflectoring/testing/UserAssert.java @@ -0,0 +1,22 @@ +package io.reflectoring.testing; + +import org.assertj.core.api.AbstractAssert; + +public class UserAssert extends AbstractAssert { + + public UserAssert(User user) { + super(user, UserAssert.class); + } + + public static UserAssert assertThat(User actual) { + return new UserAssert(actual); + } + + public UserAssert hasRegistrationDate() { + isNotNull(); + if (actual.getRegistrationDate() == null) { + failWithMessage("Expected user to have a registration date, but it was null"); + } + return this; + } +}