我想为我的BookService写一个测试。这就是那个测试。我不知道为什么我总是得到下面的错误:
org.junit.jupiter.api.extension.ParameterResolutionException: No ParameterResolver registered for parameter
[com.mrfisherman.library.service.domain.BookService bookService] in constructor
[public com.mrfisherman.library.service.domain.BookServiceTest(com.mrfisherman.library.service.domain.BookService,
com.mrfisherman.library.persistence.repository.BookRepository)].
正如你所看到的,我在这里没有使用参数化测试。感谢您的评分
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = Server.class)
class BookServiceTest {
private final BookService bookService;
private final BookRepository bookRepository;
public BookServiceTest(BookService bookService, BookRepository bookRepository) {
this.bookService = bookService;
this.bookRepository = bookRepository;
}
@Test
void saveBook() {
//given
Book book = new Book();
book.setTitle("Book 1");
book.setPublishYear(1990);
book.setType(BookFormat.REAL);
book.setIsbn("1234567890");
book.setDescription("Very good book");
book.setNumberOfPages(190);
book.setSummary("Very short summary");
book.setCategories(Set.of(new Category("horror"), new Category("drama")));
//when
bookService.saveBook(book);
//then
Optional<Book> loaded = bookRepository.findById(book.getId());
assertThat(loaded).isPresent();
}
}
3条答案
按热度按时间pu3pd22g1#
在JUnit Jupiter中,每当一个测试类构造函数、生命周期方法(如
@BeforeEach
)或测试方法声明了一个不能被注册的ParameterResolver
扩展解析的参数时,就会抛出ParameterResolutionException
。因此,即使您没有使用
@ParameterizedTest
方法,也可以抛出ParameterResolutionException
。使用
@SpringBootTest
时,SpringExtension
会自动为您注册。SpringExtension
实现了来自JUnit Jupiter的ParameterResolver
扩展API,因此您可以将ApplicationContext
中的bean注入到测试类中的构造函数和方法中。解决这个问题最简单的方法是用
@Autowired
注解BookServiceTest
构造函数。有关更多信息和替代方法,请查看Spring参考文档的Dependency Injection with
SpringExtension
部分。yb3bgrhw2#
它是参数化的。测试框架应该如何创建
BookServiceTest
类的新示例?通常,测试类有一个无参数的构造函数(此时,框架可以创建一个新的示例,而不需要任何额外的信息,例如“我如何获得一个bookService的示例来传递给这个构造函数?').
hmae6n7t3#
在junit 5测试中,jboss Weld container初始化时也会发生此错误。如果test上没有额外的annotation,@ParameterizedTest方法会失败。请使用**@ExplicitParamInjection**修复。
}