package org.springside.examples.bootapi.service;
import static org.assertj.core.api.Assertions.*;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mockito;
import org.springside.examples.bootapi.domain.Account;
import org.springside.examples.bootapi.domain.Book;
import org.springside.examples.bootapi.domain.Message;
import org.springside.examples.bootapi.repository.BookDao;
import org.springside.examples.bootapi.repository.MessageDao;
import org.springside.modules.test.log.LogbackListAppender;
public class BookBorrowServiceTest {
private BookBorrowService service;
private BookDao mockBookDao;
private MessageDao mockMessageDao;
private LogbackListAppender appender;
@Before
public void setup() {
service = new BookBorrowService();
mockBookDao = Mockito.mock(BookDao.class);
mockMessageDao = Mockito.mock(MessageDao.class);
service.bookDao = mockBookDao;
service.messageDao = mockMessageDao;
appender = new LogbackListAppender();
appender.addToLogger(BookBorrowService.class);
}
public void tearDown() {
appender.removeFromLogger(BookBorrowService.class);
}
@Test
public void applyBorrowRequest() {
Book book = new Book(1L);
book.status = Book.STATUS_IDLE;
book.owner = new Account(1L);
Mockito.when(mockBookDao.findOne(1L)).thenReturn(book);
service.applyBorrowRequest(1L, new Account(3L));
Mockito.verify(mockBookDao).save(Mockito.any(Book.class));
Mockito.verify(mockMessageDao).save(Mockito.any(Message.class));
}
@Test
public void applyBorrowRequestWithError() {
// 自己借自己的书
Book book = new Book(1L);
book.status = Book.STATUS_IDLE;
book.owner = new Account(1L);
Mockito.when(mockBookDao.findOne(1L)).thenReturn(book);
try {
service.applyBorrowRequest(1L, new Account(1L));
fail("should fail here");
} catch (Exception e) {
assertThat(e).hasMessageContaining("User shouldn't borrower the book which is himeself");
assertThat(appender.getLastMessage()).contains("user id:1,book id:1");
}
// 保证BookDao没被调用
Mockito.verify(mockBookDao, Mockito.never()).save(Mockito.any(Book.class));
// 借已借出的书
book.status = Book.STATUS_REQUEST;
try {
service.applyBorrowRequest(1L, new Account(3L));
fail("should fail here");
} catch (Exception e) {
assertThat(e).hasMessageContaining("The book is not idle");
assertThat(appender.getLastMessage()).contains("user id:3,book id:1,status:request");
}
Mockito.verify(mockBookDao, Mockito.never()).save(Mockito.any(Book.class));
}
}