도시 서비스는 회원(Member)에게 노출되는 기능은 아니고, 서비스 제공자에게만 노출되는 기능
@Repository
@RequiredArgsConstructor
public class CityRepository {
private final EntityManager em;
public void save(City city) {
em.persist(city);
}
public City findOne(Long id) {
return em.find(City.class, id);
}
public List<City> findAll() {
return em.createQuery("select c from City c", City.class).
getResultList();
}
public List<City> findByDistrict(District district) {
List<City> cityList = em.createQuery("select c from City c where c.district = :district", City.class)
.setParameter("district", district)
.getResultList();
return cityList;
}
}
@Service
@Transactional(readOnly = true)
@RequiredArgsConstructor
public class CityService {
private final CityRepository cityRepository;
@Transactional
public Long join(City city) {
validateDuplicateCity(city);
cityRepository.save(city);
return city.getId();
}
public void validateDuplicateCity(City city) {
List<City> cityList = cityRepository.findByDistrict(city.getDistrict());
if(!cityList.isEmpty()) {
throw new IllegalStateException("이미 존재하는 도시입니다.");
}
}
}
@SpringBootTest
@Transactional
class CityServiceTest {
@Autowired CityRepository cityRepository;
@Autowired CityService cityService;
/**
* 도시 추가
*/
@Test
public void join() throws Exception {
//given
District district = new District("s1", "s2", "s3");
City city = new City(district);
//when
Long cityId = cityService.join(city);
//then
assertEquals(city, cityRepository.findOne(cityId));
}
@Test
public void 구역으로_찾기() throws Exception {
//given
District district = new District("s1", "s2", "s3");
City city1 = new City(district);
//when
cityService.join(city1);
//then
assertEquals(city1, cityRepository.findByDistrict(district).get(0));
}
@Test
public void 도시_중복_확인() throws Exception {
//given
District district = new District("s1", "s2", "s3");
City city1 = new City(district);
cityService.join(city1);
//when
City city2 = new City(district);
try{
cityService.join(city2);
} catch (IllegalStateException e) {
return;
}
//then
Assertions.fail();
}
}
테스트 성공!
테스트 코드는 Spring과 독립적으로, 순수 자바 코드만으로 동작하는 테스트 코드가 좋다고 하는데
거기까지는 아직 감이 안 잡힌다.