열 한 번째 수업 이모저모

  • 수업은 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);
    }
}