Junit 5 无法将参数解析为方法
Juint 5 cannot resolve parameter to method
我有一个简单的 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));
}
}
考虑对您的代码进行以下更改:
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
为了简化起见,我引入了 存根对象,但我确信可以使用 2 个 String
参数
来解决这个问题
我有一个简单的 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));
}
}
考虑对您的代码进行以下更改:
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
为了简化起见,我引入了 存根对象,但我确信可以使用 2 个 String
参数