Juint 5无法将参数解析为方法

时间:2019-05-27 23:17:00

标签: junit5

我对Web端点进行了简单测试,并且正在使用restAssured测试json模式。我不断得到:

org.junit.jupiter.api.extension.ParameterResolutionException: No ParameterResolver registered for parameter [java.lang.String arg0] in method [void People.init(java.lang.String,java.lang.String)].

我已经阅读了JUnit 5手册,但我真的不理解该错误。 据我所知,init方法的输入字符串没有问题。我真的没有这个错误。有人可以向我解释是什么导致此错误,以及如何在这种情况下解决该问题?

import Utils;
import org.junit.jupiter.api.*;
import org.springframework.test.context.TestPropertySource;
import static io.restassured.RestAssured.get;
import static io.restassured.module.jsv.JsonSchemaValidator.matchesJsonSchemaInClasspath;

@DisplayName(value = "Tests endpoint")
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
@TestPropertySource(locations = "classpath:resources")

class People {

private String PEOPLE_QUERY = "PeopleQStar.json";
private String host = "http://dev-dev/";
private String endPoint = "people";

Utils utils = new Utils();

@BeforeAll
void init(String host, String endPoint)
{
    utils.setHostAndPath(host, endPoint);
    utils.setCommonSettings();
}

@AfterAll
void cleanUp()
{
    utils.tearDown();
}

@Order(1)
@DisplayName("Check if endpoint is up")
@Test
void initialComCheck()
{
    get().then().statusCode(200);
}

@Order(2)
@Test
public void givenUrl_whenJsonResponseConformsToSchema_thenCorrect() {

    get("?q=*").then().assertThat()
            .body(matchesJsonSchemaInClasspath(PEOPLE_QUERY));
}
}

1 个答案:

答案 0 :(得分:0)

请考虑对代码进行以下更改:

import org.junit.jupiter.api.extension.ExtendWith;
import org.junit.jupiter.api.extension.ExtensionContext;
import org.junit.jupiter.api.extension.ParameterContext;
import org.junit.jupiter.api.extension.ParameterResolutionException;
import org.junit.jupiter.api.extension.ParameterResolver;
//... other imports and annotations
@ExtendWith(CustomParameterResolver.class) // your custom parameter resolver, see below
class People {

//...

  @BeforeAll
  void init(Server server) // custom stub for storage of your params
  {
    utils.setHostAndPath(server.getHost(), server.getEndpoint());
    utils.setCommonSettings();
  }

  // other methods as it is
}

  static class Server {
    private String host = "http://dev-dev/";
    private String endpoint = "people";

    public String getHost() {
      return host;
    }

    public String getEndpoint() {
      return endpoint;
    }
  }

  static class CustomParameterResolver implements ParameterResolver {

    @Override
    public boolean supportsParameter(ParameterContext parameterContext,
        ExtensionContext extensionContext) throws ParameterResolutionException {
      return (parameterContext.getParameter().getType() == Server.class);
    }

    @Override
    public Object resolveParameter(ParameterContext parameterContext,
        ExtensionContext extensionContext) throws ParameterResolutionException {
      return new Server();
    }
  }

那应该有助于解决您的问题。您遇到的主要问题是@BeforeAll方法的默认签名(不带参数)。这就是为什么您会得到一个异常的原因(因为它不知道您尝试传递的任何自定义参数)。为了解决此问题,JUnit 5 API允许您定义自定义ParameterResolver并随后将其应用于@ExtendsWith

为简化起见,我引入了 stub对象,但是我敢肯定有一个选项可以用2个String参数来解决