이전글:
2023.09.24 - [웹/Spring vue 웹 개발] - [리팩토링] 게시판01(data/repository)
이전 글은 data/repository를 코드 변경과 테스트코드도 작성했는데요.
이번엔 service/contoller 부분을 코드와 테스트 코드를 작성하려고 합니다.
세션같은건 조금 나중에 추가할꺼라 일단 이렇게 작성하도록 하겠습니다.
1.service/controller 코드
NoticeService: 인터페이스
package kr.co.kshproject.webDemo.Applicaiton.Notice;
import kr.co.kshproject.webDemo.Domain.Notice.Notice;
import java.util.List;
import java.util.Optional;
public interface NoticeService {
Notice save(Notice notice);
List<Notice> findAll();
Optional<Notice> findById(Long id);
void deleteAll();
}
NoticeServiceImpl : 서비스 클래스
package kr.co.kshproject.webDemo.Applicaiton.Notice;
import kr.co.kshproject.webDemo.Domain.Notice.Notice;
import kr.co.kshproject.webDemo.Domain.Notice.NoticeRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Optional;
@Service
public class NoticeServiceImpl implements NoticeService {
private final NoticeRepository noticeRepository;
@Autowired
public NoticeServiceImpl(NoticeRepository noticeRepository){
this.noticeRepository=noticeRepository;
}
@Override
public Notice save(Notice notice) {
return noticeRepository.save(notice);
}
@Override
public List<Notice> findAll() {
return noticeRepository.findAll();
}
@Override
public Optional<Notice> findById(Long id) {
return noticeRepository.findById(id);
}
@Override
public void deleteAll() {
noticeRepository.deleteAll();
}
}
NoticeController: 컨트롤러
package kr.co.kshproject.webDemo.interfaces.Notice;
import kr.co.kshproject.webDemo.Applicaiton.Notice.NoticeService;
import kr.co.kshproject.webDemo.Domain.Notice.Notice;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Optional;
@Slf4j
@RestController
@RequestMapping("/notice")
public class NoticeController {
private final NoticeService noticeService;
@Autowired
public NoticeController(NoticeService noticeService){
this.noticeService=noticeService;
}
@PostMapping
public ResponseEntity<Notice> save(Notice notice){
return ResponseEntity.ok(noticeService.save(notice));
}
@GetMapping
public ResponseEntity<List<Notice>> findAll(){
return ResponseEntity.ok( noticeService.findAll());
}
@GetMapping("/{id}")
public Optional<Notice> findById(@PathVariable Long id){
return noticeService.findById(id);
}
@DeleteMapping
public void deleteAll(){
noticeService.deleteAll();
}
}
2.service/controller 테스트 코드
서비스 테스트 코드:
package kr.co.kshproject.webDemo.Applicaiton.Notice;
import kr.co.kshproject.webDemo.Domain.Notice.Notice;
import kr.co.kshproject.webDemo.Domain.Notice.NoticeRepository;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.when;
class NoticeServiceImplTest {
@Mock
private NoticeRepository noticeRepository;
@InjectMocks
private NoticeServiceImpl noticeService;
@BeforeEach
public void setUp(){
MockitoAnnotations.openMocks(this);
}
@AfterEach
void afterEach(){
noticeService.deleteAll();
}
@Test
void save() {
//생성
Notice notice= new Notice(null,"test","title","cotenst","email","date");
// 저장 동작을 모의화
when(noticeRepository.save(any(Notice.class))).thenReturn(notice);
//체크
Optional<Notice> findNotice= Optional.ofNullable(noticeService.save(notice));
assertThat(findNotice.get()).isEqualTo(notice);
}
@Test
void findAll() {
//생성
Notice notice1= new Notice(null,"test1","title","cotenst","email","date");
Notice notice2= new Notice(null,"test2","title","cotenst","email","date");
when(noticeRepository.findAll()).thenReturn(Arrays.asList(notice1, notice2));
//find
List<Notice> result = noticeRepository.findAll();
assertThat(result.size()).isEqualTo(2);
assertThat(result).contains(notice1, notice2);
}
@Test
void findById() throws Exception {
//생성
Long id = 1L;
Notice notice= new Notice(null,"test","title","cotenst","email","date");
// 저장 동작을 모의화
when(noticeRepository.findById(id)).thenReturn(Optional.of(notice));
// When
Optional<Notice> foundNotice = noticeService.findById(id);
assertThat(foundNotice.get()).isEqualTo(notice);
}
}
컨트롤러 테스트 코드
package kr.co.kshproject.webDemo.interfaces.Notice;
import kr.co.kshproject.webDemo.Applicaiton.Notice.NoticeService;
import kr.co.kshproject.webDemo.Domain.Notice.Notice;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
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 static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.when;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
class NoticeControllerTest {
private MockMvc mockMvc;
@Mock
private NoticeService noticeService;
@InjectMocks
private NoticeController noticeController;
@BeforeEach
public void setUp() {
MockitoAnnotations.openMocks(this);
mockMvc = MockMvcBuilders.standaloneSetup(noticeController).build();
}
@Test
void save() throws Exception {
//생성
Notice notice= new Notice(null,"test","title","cotenst","email","date");
//저장
when(noticeService.save(any(Notice.class))).thenReturn(notice);
//체크
mockMvc.perform(post("/notice")
.contentType(MediaType.APPLICATION_JSON)
.content("{}"))
.andExpect(status().isOk());
}
@Test
void findAll() throws Exception {
//생성
Notice notice1= new Notice(null,"test1","title","cotenst","email","date");
Notice notice2= new Notice(null,"test2","title","cotenst","email","date");
//저장
when(noticeService.findAll()).thenReturn(Arrays.asList(notice1, notice2));
//체크
mockMvc.perform(get("/notice"))
.andExpect(status().isOk())
.andExpect(content().contentType(MediaType.APPLICATION_JSON));
}
@Test
void findById() throws Exception {
//생성
Long id = 1L;
Notice notice= new Notice(null,"test","title","cotenst","email","date");
//저장
when(noticeService.save(any(Notice.class))).thenReturn(notice);
//체크
mockMvc.perform(get("/notice/"+id))
.andExpect(status().isOk())
.andExpect(content().contentType(MediaType.APPLICATION_JSON));
}
}
문제 없이 되었죠.
이제 update 부분들 완성하고 세션 추가해서 운영서버에 올려 보도록 하겠습니다.
'웹 > Spring vue 웹 개발' 카테고리의 다른 글
spring vue 게시판 리팩토링 완료 (프론트단 및 백단 연결 변경 완료) (0) | 2023.10.08 |
---|---|
spring vue 게시판03 리팩토링 update test code (0) | 2023.10.02 |
spring vue 게시판01 리팩토링 (data/repository) (0) | 2023.09.24 |
spring vue 장바구니 07 (0) | 2023.06.14 |
spring vue 장바구니 06 (0) | 2023.06.13 |