spring JUnit 5/Mockito值错误

mwngjboj  于 2023-11-16  发布在  Spring
关注(0)|答案(1)|浏览(97)

我是模块测试的新手。请帮助我找到我做错了什么。
我的仓库:

@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个值),而不管我调用的值是什么。我应该怎么做来解决这个问题?

68bkxrlz

68bkxrlz1#

正如Sledgehammer在评论中也提到的,现在你正在覆盖实际的Spring Data JPA查询,并告诉你的模拟存储库总是返回2本书(没有对数据库运行实际的查询)。
如果你想测试实际的查询是否有效,你需要让仓库查询从一个实际的数据库中获取数据(在你的例子中是MySQL,但你也可以使用H2)。这样你就可以摆脱模拟的仓库,并查询你的数据库作为集成测试。
在集成测试中应该有大量测试Spring Data JPA查询的示例。

相关问题