【问题标题】:Why do I have ParameterResolutionException when I don't even use parametrized test?当我什至不使用参数化测试时,为什么会出现 ParameterResolutionException?
【发布时间】:2021-01-28 09:51:46
【问题描述】:

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

    }
}

【问题讨论】:

    标签: java junit junit5 spring-test


    【解决方案1】:

    参数化的。测试框架应该如何创建BookServiceTest 类的新实例?

    通常,测试类有一个无参数构造函数(此时,框架可以创建一个新实例而不需要任何其他信息,例如“如何获取 bookService 的实例以传递给此构造函数?” )。

    【讨论】:

    • 那么我现在应该做什么,使用@BeforeAll 并放上BookService 和BookRepository?
    • MrFisherman 正在使用 Spring。因此,最后一条评论是不好的建议。在使用 Spring Boot 的集成测试中,人们宁愿将 Spring 管理的组件注入到测试类实例中——例如使用 @Autowired
    • @SamBrannen D'oh,是的,当然 - 我已经删除了我的评论(建议使用 @Before 初始化它们的方法)。
    【解决方案2】:

    在 JUnit Jupiter 中,只要测试类构造函数、生命周期方法(例如 @BeforeEach)或测试方法声明的参数无法由注册的 ParameterResolver 扩展之一解析,就会抛出 ParameterResolutionException

    因此,即使您没有使用@ParameterizedTest 方法,也可以抛出ParameterResolutionException

    使用@SpringBootTest 时,会自动为您注册SpringExtensionSpringExtension 实现了来自 JUnit Jupiter 的 ParameterResolver 扩展 API,因此您可以将来自 ApplicationContext 的 bean 注入到测试类的构造函数和方法中。

    解决问题的最简单方法是使用 @Autowired 注释 BookServiceTest 构造函数。

    有关更多信息和替代方法,请查看 Spring 参考文档的 Dependency Injection with SpringExtension 部分。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-31
      • 1970-01-01
      • 2013-11-13
      • 2010-10-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多