【发布时间】:2019-05-15 13:02:49
【问题描述】:
我想从控制器和服务层测试相同的方法。问题是:为什么我必须在控制器中使用@MockBean注解,为什么BookFindOperationsService bookService不用@Mock注解。同样的服务问题,为什么我需要@Mock 存储库,为什么不使用@MockBean?你能告诉我这两者的区别吗?
这里是控制器:
@RestController
public class BookFindOperationsController {
private final BookFindOperationsService bookService;
@Autowired
public BookFindOperationsController(BookFindOperationsService bookService) {
this.bookService = bookService;
}
@GetMapping("/books/author/{authorID}")
public List<Book> findBooksByAuthor(@PathVariable String authorID) {
return bookService.findBooksByAuthor(authorID);
}
}
这里是服务类:
@Service
public class BookFindOperationsService {
private final BookRepository bookRepository;
@Autowired
public BookFindOperationsService(BookRepository bookRepository) {
this.bookRepository = bookRepository;
}
public List<Book> findBooksByAuthor(String authorID) {
return bookRepository.findByAuthorAllIgnoreCase(authorID);
}
}
服务测试:
@RunWith(MockitoJUnitRunner.class)
public class BookFindOperationsServiceTest {
@Mock
BookRepository bookRepository;
@InjectMocks
BookFindOperationsService bookFindOperationsService;
@Test
public void findBooksByAuthor() {
Book book = createDummyBook();
List<Book> books = new ArrayList<>();
books.add(book);
when(bookRepository.findByAuthorAllIgnoreCase("Henryk Sienkiewicz")).thenReturn(books);
assertEquals(1, bookFindOperationsService.findBooksByAuthor("Henryk Sienkiewicz").size());
}
private Book createDummyBook() {
return new Book("W pustyni i w puszczy", "Henryk Sienkiewicz", "dramat", true);
}
控制器测试:
@RunWith(SpringRunner.class)
@WebMvcTest(BookFindOperationsController.class)
public class BookFindOperationsControllerTest {
@Autowired
MockMvc mockMvc;
@MockBean
BookFindOperationsService bookService;
@Test
public void findBooksByAuthor() throws Exception {
List<Book> books = new ArrayList<>();
Book book = new Book("W pustyni i w puszczy", "Henryk Sienkiewicz", "dramat", true);
books.add(book);
when(bookService.findBooksByAuthor("Henryk Sienkiewicz")).thenReturn(books);
String expected = "[{\"id\":0,\"title\":\"W pustyni i w puszczy\",\"author\":\"Henryk Sienkiewicz\",\"category\":\"dramat\",\"available\":true}]";
MvcResult mvcResult = mockMvc.perform(get("/books/author/Henryk Sienkiewicz")
.contentType(MediaType.APPLICATION_JSON_UTF8))
.andExpect(status().isOk())
.andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8))
.andReturn();
String content = mvcResult.getResponse().getContentAsString();
assertEquals(expected, content);
verify(bookService, times(1)).findBooksByAuthor(anyString());
}
【问题讨论】:
-
@vmaldosan 不,我想知道为什么我不能使用 Mock 而不是 MockBean。我得到 NullPointer 什么的。
标签: java spring unit-testing spring-boot mockmvc