Next JWP Study 11
2017.05.16
study jwp mockito DI
DI 기반 단위 테스트
열 한 번째 수업 이모저모
- 수업은
2017-05-15 19:00:00 +0900
에 시작. - 이제 수업이 3주 남았다.
- 다음 주 부터는 5회에 걸쳐 Spring Boot를 학습한다.
- 마지막 수업엔 개발한 Spring Boot 어플리케이션의 배포를 실습한다.
- 이론 수업
- 빈 컨테이너 설정 관리
- Spring life cycle
- Property Source 및 환경 변수
- Java Bean Validation
- DI 기반 단위 테스트
- 피자/맥주 파티
- 약 21시부터 피자/맥주 파티를 하며 담소를 나누었다.
- 나는 피자/맥주/콜라 모두 안 먹는 음식들이라 생수만 마셨다.
Mockito 테스트 실습
Mockito를 사용하니 어렵지 않고 깔끔하게 끝낼 수 있었다. 약간 우려스러운 점이 있긴 하지만 아직은 Mockito를 잘 모르니 좀 더 익숙해지면 생각해보도록 하자.
@RunWith(MockitoJUnitRunner.class)
public class QnaServiceTest {
@Mock
private QuestionDao questionDao;
@Mock
private AnswerDao answerDao;
private QnaService qnaService;
@Before
public void setup() {
qnaService = new QnaService(questionDao, answerDao);
}
// 로그인 사용자와 질문한 사람이 같아야 한다.
@Test
public void Positive_질문한_사람과_삭제하려는_사람이_같으면_삭제할_수_있다() throws CannotOperateException {
final User user = new User("질문하는 사람 아이디", "password", "name", "email");
final Question question = new Question(0, user.getUserId(), "제목", "내용", new Date(), 0);
when(questionDao.findById(question.getQuestionId())).thenReturn(question);
qnaService.deleteQuestion(question.getQuestionId(), user);
}
// 로그인 사용자와 질문한 사람이 같아야 한다.
@Test(expected = CannotOperateException.class)
public void Negative_질문한_사람과_삭제하려는_사람이_다르면_삭제할_수_없다() throws CannotOperateException {
final Question question = new Question(0, "질문하는 사람 아이디", "제목", "내용", new Date(), 0);
final User otherUser = new User("삭제하는 사람 아이디", "password", "name", "email");
when(questionDao.findById(question.getQuestionId())).thenReturn(question);
qnaService.deleteQuestion(question.getQuestionId(), otherUser);
}
// 답변이 없는 경우 삭제가 가능하다.
@Test
public void Positive_답변이_없는_경우_삭제가_가능하다() throws CannotOperateException {
final User user = new User("질문하는 사람 아이디", "password", "name", "email");
final Question question = new Question(0, user.getUserId(), "제목", "내용", new Date(), 0);
when(questionDao.findById(question.getQuestionId())).thenReturn(question);
when(answerDao.findAllByQuestionId(question.getQuestionId())).thenReturn(Collections.EMPTY_LIST);
qnaService.deleteQuestion(question.getQuestionId(), user);
}
// 답변이 없는 경우 삭제가 가능하다.
@Test(expected = CannotOperateException.class)
public void Negative_답변이_있다면_삭제할_수_없다() throws CannotOperateException {
final User user = new User("질문하는 사람 아이디", "password", "name", "email");
final Question question = new Question(0, user.getUserId(), "제목", "내용", new Date(), 0);
final Answer answer = new Answer(0, "답변하는 사람 아이디", "내용", new Date(), question.getQuestionId());
when(questionDao.findById(question.getQuestionId())).thenReturn(question);
when(answerDao.findAllByQuestionId(question.getQuestionId())).thenReturn(Arrays.asList(answer));
qnaService.deleteQuestion(question.getQuestionId(), user);
}
// 질문자와 답변자가 같은 경우 삭제가 가능하다.
@Test
public void Positive_답변이_있어도_질문자와_답변자가_같다면_삭제할_수_있다() throws CannotOperateException {
final User user = new User("질문하는 사람 아이디", "password", "name", "email");
final Question question = new Question(0, user.getUserId(), "제목", "내용", new Date(), 0);
final Answer answer = new Answer(0, user.getUserId(), "내용", new Date(), question.getQuestionId());
when(questionDao.findById(question.getQuestionId())).thenReturn(question);
when(answerDao.findAllByQuestionId(question.getQuestionId())).thenReturn(Arrays.asList(answer));
qnaService.deleteQuestion(question.getQuestionId(), user);
}
// 질문자와 답변자가 다른 경우 답변을 삭제할 수 없다.
@Test(expected = CannotOperateException.class)
public void Negative_답변이_있을_때_질문자와_답변자가_다르면_삭제할_수_없다() throws CannotOperateException {
final User user = new User("질문하는 사람 아이디", "password", "name", "email");
final Question question = new Question(0, "답변하는 사람 아이디", "제목", "내용", new Date(), 0);
final Answer answer = new Answer(0, user.getUserId(), "내용", new Date(), question.getQuestionId());
when(questionDao.findById(question.getQuestionId())).thenReturn(question);
when(answerDao.findAllByQuestionId(question.getQuestionId())).thenReturn(Arrays.asList(answer));
qnaService.deleteQuestion(question.getQuestionId(), user);
}
}
Links
- 과제 완료
- 수업 자료