添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
Collectives™ on Stack Overflow

Find centralized, trusted content and collaborate around the technologies you use most.

Learn more about Collectives

Teams

Q&A for work

Connect and share knowledge within a single location that is structured and easy to search.

Learn more about Teams

I can write up and execute Selenium script without any special test framework but I wanted to use Junit 5 (because we have dependency with other tools) and I have never seen such error org.junit.jupiter.api.extension.ParameterResolutionException while working with Junit 4.

Currently it's Junit 5 and I googled it to get some sort of idea but can not resolve the issue.

Test script using JUnit 5 , Eclipse 4.8 and Selenium :

import static org.junit.jupiter.api.Assertions.assertEquals;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
public  class loginTest  {
    public  WebDriver driver = null;
    public loginTest(WebDriver driver) {
        this.driver=driver;
    @BeforeEach
    public void setUp() throws Exception {
        driver.get("google.com");
        System.out.println("Page title is: " + driver.getTitle());
    @Test
    public void test() {
        // some action here I have in original script
        System.out.println("Page title is: " + driver.getTitle());
    @AfterEach
    public void tearDown() throws Exception {
        driver.quit();

Stack trace:

org.junit.jupiter.api.extension.ParameterResolutionException: No ParameterResolver registered for parameter [org.openqa.selenium.WebDriver arg0] in executable [public login.loginTest(org.openqa.selenium.WebDriver)]. at org.junit.jupiter.engine.execution.ExecutableInvoker.resolveParameter(ExecutableInvoker.java:191)

JUnit needs to instantiate the test class using its constructor which has a WebDriver parameter. Thus, it looks for a registered ParameterResolver to resolve it but there's none registered. Do you have an extension that provides the WebDriver instance? – Marc Philipp Aug 16, 2018 at 6:22 Having only ´@Test´ also lead me to this page. Switched it to ´@ParameterizedTest´, and it works. – jumps4fun Apr 21, 2022 at 13:57 I had @RepeatedTest instead of @Test and also removing @Test solved the issue of No ParameterResolver registered for parameter [org.junit.jupiter.api.RepetitionInfo arg0]. – banan3'14 Dec 29, 2022 at 15:22

As Marc Philipp mentioned in his comment, you need to ensure that JUnit Jupiter can instantiate your test class.

For your particular scenario, you'll need to remove your custom constructor that accepts a WebDriver.

Then you have two options:

  • Create the WebDriver on your own -- for example, in an @BeforeAll or @BeforeEach method.
  • Use an extension such as Selenium Jupiter to help manage the WebDriver for you.
  • I also got ParameterResolutionException with JUnit 5.

    org.junit.jupiter.api.extension.ParameterResolutionException: 
    No ParameterResolver registered for parameter [int[] arg0] in constructor (public my_package.MyClass(int[]))
    

    I had written @Test methods inside the class I was testing.

    This error could be fixed in two ways:

    1) Either replacing import org.junit.jupiter.api.Test with import org.junit.Test, or

    2) Writing tests in a separate TestClass.

    In my case, 1st case only ignored the test, even though it didn't throw an error but that wasn't the desired result after all. – rpajaziti Oct 28, 2022 at 0:41

    It is maybe not an answer to the question above, but for me using Spring-Boot, and Lomboks @RequiredArgsConstructor, JUnit couldn't autowire the dependencies. My class looked like that:

    @ExtendWith(SpringExtension.class)
    @ContextConfiguration(classes = { TestPersistenceConfiguration.class, MyRepositoryTest.TestConfiguration.class })
    @RequiredArgsConstructor
    class MyRepositoryTest
        private final MyRepository repository;
        private final TransactionTemplate tt;
    // test methods...
        @Configuration
        @EnableJpaRepositories(basePackageClasses = { MyRepository.class })
        static class TestConfiguration {}
    

    I just had to add onConstructor = @__(@Autowired) to the RequiredArgsConstructor annotation:

    @ExtendWith(SpringExtension.class)
    @ContextConfiguration(classes = { TestPersistenceConfiguration.class, MyRepositoryTest.TestConfiguration.class })
    @RequiredArgsConstructor(onConstructor = @__(@Autowired))
    class MyRepositoryTest
    // everything as before
                    If what you are referring to @RequiredArgsConstructor is provided by lombok. Then what onConstructor = @__(@Autowired) does is add the @Autowired annotation to constructor parameters. If you have your own constructor, you can annotate your parameters with @Autowired manually to achieve the same behaviour.
    – Missaka Iddamalgoda
                    Jan 24 at 4:46
                    @MissakaIddamalgoda @Autowired is not added to the parameters, but to the constructor itself. Yes, you could add it to the fields, but then they cant be final any more because they will be assigned post-construct.
    – Valerij Dobler
                    Jan 24 at 12:39
                    Yes. What I meant is add the autowired annotation to the either Constructor or else if you only one parameter in the constructor then you annotate just the parameter itself as MyClass(@Autowired DB db). I didn't suggest Autowiring the fields themselves.
    – Missaka Iddamalgoda
                    Jan 25 at 4:32
                    If you're not familiar with Lombok.RequiredArgsConstructor it generates the constructor, hence there is no constructor to add the annotation to in the source code.
    – Valerij Dobler
                    Jan 26 at 7:29
                    @MissakaIddamalgoda I'd suggest you read up on it, try to understand, what it is and what it is used for and then comment on it.
    – Valerij Dobler
                    Jan 26 at 7:32
    

    I got this error because my test needed my Spring Boot server to be running first, so that dependency injection using @Autowired would get executed. I added these annotations:

    @Transactional
    @ExtendWith(SpringExtension.class)
    @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = Server.class)
    public MyTestClass () {
    

    Removing constructor and adding as parameter in test method, solved my problem in JUnit 5.

    @ParameterizedTest
    @MethodSource("data")
    public void check(String input, boolean expected) {
        assertThat(inpu).isEqualTo(expected);
    private static Stream<Arguments> data() {
        return Stream.of(
                Arguments.of("A", false),
                Arguments.of("B", false)
    

    In my situation I had 2 parameters. The first parameter was using @AggregateWith, the second parameter should not have been aggregated and was already of the correct type, but JUnit tried to aggregate it as well.

    Switching parameter 0 and 1 solved the issue for me (that is, the parameter annotated with @AggregateWith is now at the end).

    I think the WebDriver class in your project is not Annotated as a bean and it cannot be injected, i had the same problem and when i changed the injection way from constructor injection into instance variable injection, it throws NoSuchBeanDefinitionException ("No qualifying bean of type '...service.RsRepositoryService' available: "), it does not find the bean that we are trying to inject. Hope this helps someone with this problem :)

    If you're using Kotlin & Spring Boot, using the primary constructor to inject dependencies (as you'd normally do) would introduce this error. Solution: use property injection instead of constructor injection.

    Not working:

    @SpringBootTest
    class Failing(val someDependency: SomeDependency) {
        @Test
        fun foo() {}
    

    Working:

    @SpringBootTest
    class Working {
        @Autowired lateinit var someDependency: SomeDependency
        @Test
        fun foo() {}
    

    I haven't seen the answer that worked for me. I got the error because I initiated my object using a constructor instead of for each. Don't use a constructor, use beforeEach, like this:

    class Testclass {
       private ObjectToRunTestsOn objectToRunTestsOn;
        @BeforeEach()
        void beforeEach() {
            objectToRunTestsOn= new ObjectToRunTestsOn();
    

    I have been investigated this issue in my project. I made a conclusion that this problem can occurs in 2 cases:

  • You create a constructor with argument. The compiler cannot accept this. So you need delete argument in conctructor. Or you can make your test class abstract and delegate argument to inheritors.
  • You create testMethod with argument. I advise to delete argument from these methods. Annotation @ParameterizedTest do not help in solving this problem for me. I use only @Test annotation
  • Thanks for contributing an answer to Stack Overflow!

    • Please be sure to answer the question. Provide details and share your research!

    But avoid

    • Asking for help, clarification, or responding to other answers.
    • Making statements based on opinion; back them up with references or personal experience.

    To learn more, see our tips on writing great answers.