java 为什么我甚至没有使用参数化测试时会出现ParameterResolutionException?

omtl5h9j  于 2023-05-05  发布在  Java
关注(0)|答案(3)|浏览(266)

我想为我的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();

    }
}
pu3pd22g

pu3pd22g1#

在JUnit Jupiter中,每当一个测试类构造函数、生命周期方法(如@BeforeEach)或测试方法声明了一个不能被注册的ParameterResolver扩展解析的参数时,就会抛出ParameterResolutionException
因此,即使您没有使用@ParameterizedTest方法,也可以抛出ParameterResolutionException
使用@SpringBootTest时,SpringExtension会自动为您注册。SpringExtension实现了来自JUnit Jupiter的ParameterResolver扩展API,因此您可以将ApplicationContext中的bean注入到测试类中的构造函数和方法中。
解决这个问题最简单的方法是用@Autowired注解BookServiceTest构造函数。
有关更多信息和替代方法,请查看Spring参考文档的Dependency Injection with SpringExtension部分。

yb3bgrhw

yb3bgrhw2#

它是参数化的。测试框架应该如何创建BookServiceTest类的新示例?
通常,测试类有一个无参数的构造函数(此时,框架可以创建一个新的示例,而不需要任何额外的信息,例如“我如何获得一个bookService的示例来传递给这个构造函数?').

hmae6n7t

hmae6n7t3#

在junit 5测试中,jboss Weld container初始化时也会发生此错误。如果test上没有额外的annotation,@ParameterizedTest方法会失败。请使用**@ExplicitParamInjection**修复。

@EnableWeld
@ExplicitParamInjection // that should be put to prevent error in test run
class MyCustomTest {

    @WeldSetup
    public WeldInitiator weld = WeldInitiator.from()...........build();

    @CsvSource(value = {1, 2, 3})
    @ParameterizedTest
    void getEventsByFilter(int inputValue) {
       // do some stuff with inputValue
    }
}

}

相关问题