Java 如何模拟JPA存储库';单元测试中的查找方法
我正在努力完成我的小项目,我遇到了一个问题。 我的应用程序使用一个简单的分层体系结构,我不能碰巧使用服务层。 事实上,我试图从Spring数据模拟类。 我试图模拟我的一个存储库的findAll方法,该存储库正在扩展这个类,但mockito无法模拟接口。 除了自己创建bean并填充它之外,还有什么方法可以做到这一点吗 [更新] 以下是存储库代码:Java 如何模拟JPA存储库';单元测试中的查找方法,java,unit-testing,spring-boot,mockito,junit5,Java,Unit Testing,Spring Boot,Mockito,Junit5,我正在努力完成我的小项目,我遇到了一个问题。 我的应用程序使用一个简单的分层体系结构,我不能碰巧使用服务层。 事实上,我试图从Spring数据模拟类。 我试图模拟我的一个存储库的findAll方法,该存储库正在扩展这个类,但mockito无法模拟接口。 除了自己创建bean并填充它之外,还有什么方法可以做到这一点吗 [更新] 以下是存储库代码: package fr.kaf.interview.Repository; import fr.kaf.interview.model.Book; im
package fr.kaf.interview.Repository;
import fr.kaf.interview.model.Book;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface BookRepository extends CrudRepository<Book,Long> {
}
包fr.kaf.interview.Repository;
导入fr.kaf.interview.model.Book;
导入org.springframework.data.repository.crudepository;
导入org.springframework.stereotype.Repository;
@存储库
公共接口BookRepository扩展了Crudepository{
}
以下是UT:
@ExtendWith(MockitoExtension.class)
class BookServiceTest {
@Mock
private BookRepository bookRepository;
@InjectMocks
private BookService bookService;
@Test
public void should_get_All_books_from_database() {
//Given
Person author = new Person();
author.setFirstName("Ka");
author.setLastName("AwQl");
Book firstBook = new Book();
firstBook.setTitle("One Book");
firstBook.setAuthors(singletonList(author));
Book secondBook = new Book();
secondBook.setTitle("Second Book");
secondBook.setAuthors(singletonList(author));
given(bookRepository.findAll()).willReturn(asList(firstBook, secondBook));
//When
List<Book> allBooks = bookService.getAllBooks();
//Then
assertThat(allBooks).containsExactly(firstBook, secondBook);
}
}
@ExtendWith(MockitoExtension.class)
类图书服务测试{
@嘲弄
私人书库;
@注射模拟
私人图书服务;
@试验
public void应该从数据库()获取所有书籍{
//给定
Person author=新的Person();
作者:setFirstName(“Ka”);
author.setLastName(“AwQl”);
第一本书=新书();
firstBook.setTitle(“一本书”);
setAuthors(singletonList(author));
第二本书=新书();
第二本书。书名(“第二本书”);
secondBook.setAuthors(singletonList(author));
给定(bookRepository.findAll()).willReturn(asList(firstBook,secondBook));
//什么时候
List allBooks=bookService.getAllBooks();
//然后
资产(所有账簿)。实际包含(第一册、第二册);
}
}
我想知道问题是否在于Mockito不确定如何将bookService
注入到Spring测试上下文中
我将尝试使用JUnit5用户指南“”部分底部的建议,使用@extensdwith(SpringExtension.class)
注释测试
该注释的源代码为
我还认为有可能给定的
和的when\\then
样式会有不同的结果。如果我记得很清楚,您的测试必须使用以下内容:
@之前
公共void init(){
initMocks(this);
}
您介意分享更多您的代码吗?比如你的CrudRespository和你的单元测试用例?@Brandon当然,请找到附件中的codemockito应该可以很好地模拟该接口-你得到了什么异常?@Janar:Mockito不能模拟这个类:interface fr.test.repo.Repository.BookRepository。错误是这样的:“Mockito只能模拟非私有和非最终类。如果您不确定为什么会出现此错误,请向邮件列表报告。”您确定引发该异常的是给定的(bookRepository.findAll())
行吗?“全部查找”是一个非最终的公共方法,因此应该可以。