Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何模拟JPA存储库';单元测试中的查找方法_Java_Unit Testing_Spring Boot_Mockito_Junit5 - Fatal编程技术网

Java 如何模拟JPA存储库';单元测试中的查找方法

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

我正在努力完成我的小项目,我遇到了一个问题。 我的应用程序使用一个简单的分层体系结构,我不能碰巧使用服务层。 事实上,我试图从Spring数据模拟类。 我试图模拟我的一个存储库的findAll方法,该存储库正在扩展这个类,但mockito无法模拟接口。 除了自己创建bean并填充它之外,还有什么方法可以做到这一点吗

[更新] 以下是存储库代码:

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())
行吗?“全部查找”是一个非最终的公共方法,因此应该可以。