我是模块测试的新手。请帮助我找到我做错了什么。
我的仓库:
@Repository
public interface BookRepository extends JpaRepository<Book, Integer> {
List<Book> findByAuthorContainingIgnoreCase(String author);
List<Book> findByGenreContainingIgnoreCase(String genre);
List<Book> findByNameContainingIgnoreCase(String name);
}
字符串
我的服务:
public List<Book> findByAuthorContaining(String author){
return bookRepository.findByAuthorContainingIgnoreCase(author);
}
型
和测试:
@Test
public void findByAuthors(){
List<Book> books = getBooks();
Mockito.when(bookRepository.findByAuthorContainingIgnoreCase(any())).thenReturn(books);
List<Book> result = bookService.findByAuthorContaining("testAuthor2");
Assertions.assertEquals(1, result.size());
}
private List<Book> getBooks(){
Book firstBook = new Book();
Book secondBook = new Book();
firstBook.setId_book(1);
firstBook.setAmount(1);
firstBook.setImage("/test1");
firstBook.setGenre("testGenre");
firstBook.setAuthor("testAuthor");
firstBook.setYear(2001);
firstBook.setPages(1);
firstBook.setPrice(1);
secondBook.setId_book(2);
secondBook.setAmount(2);
secondBook.setImage("/test2");
secondBook.setGenre("testGenre2");
secondBook.setAuthor("testAuthor2");
secondBook.setYear(2002);
secondBook.setPages(2);
secondBook.setPrice(2);
return List.of(firstBook, secondBook);
}
型
我的方法findByAuthorContaining可以正常工作。但是当我运行模块测试时,方法返回所有List(2个值),而不管我调用的值是什么。我应该怎么做来解决这个问题?
1条答案
按热度按时间68bkxrlz1#
正如Sledgehammer在评论中也提到的,现在你正在覆盖实际的Spring Data JPA查询,并告诉你的模拟存储库总是返回2本书(没有对数据库运行实际的查询)。
如果你想测试实际的查询是否有效,你需要让仓库查询从一个实际的数据库中获取数据(在你的例子中是MySQL,但你也可以使用H2)。这样你就可以摆脱模拟的仓库,并查询你的数据库作为集成测试。
在集成测试中应该有大量测试Spring Data JPA查询的示例。