import static org.junit.jupiter.api.Assertions.*;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
class UserServiceIntegrationTest {
private UserRepository userRepository;
private UserService userService;
@BeforeEach
void setUp() {
userRepository = new InMemoryUserRepository(); // simple in-memory implementation
userService = new UserService(userRepository);
}
@Test
void testCreateAndRetrieveUser() {
User user = new User("Alice", "alice@example.com");
userService.createUser(user);
User retrieved = userService.getUserByEmail("alice@example.com");
assertNotNull(retrieved, "Retrieved user should not be null");
assertEquals("Alice", retrieved.getName(), "User name should match");
assertEquals("alice@example.com", retrieved.getEmail(), "User email should match");
}
}
// Supporting classes for completeness
class User {
private final String name;
private final String email;
public User(String name, String email) {
this.name = name;
this.email = email;
}
public String getName() { return name; }
public String getEmail() { return email; }
}
interface UserRepository {
void save(User user);
User findByEmail(String email);
}
class InMemoryUserRepository implements UserRepository {
private final Map<String, User> storage = new HashMap<>();
@Override
public void save(User user) {
storage.put(user.getEmail(), user);
}
@Override
public User findByEmail(String email) {
return storage.get(email);
}
}
class UserService {
private final UserRepository userRepository;
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
public void createUser(User user) {
userRepository.save(user);
}
public User getUserByEmail(String email) {
return userRepository.findByEmail(email);
}
}
This test verifies the interaction between UserService and UserRepository. The @BeforeEach method sets up a fresh in-memory repository and service before each test to keep tests independent.
The test testCreateAndRetrieveUser creates a user, saves it via UserService, then retrieves it by email. Assertions check that the retrieved user is not null and that the name and email match the input.
This confirms that UserService correctly uses UserRepository to store and fetch data, which is the core purpose of integration testing: verifying that components work together as expected.