我想知道是否有办法参数化 QuarkustTests 和 TestSecurity 可以参数化?目前我有这样的东西
@QuarkusTest
class MyTest {
@Inject
Testservice testee;
@Test
@TestSecurity(user = "a", roles = "a")
void testWithRole_a_throwsException() {
assertThrows(ForbiddenException.class, () -> testee.myMethod());
}
@Test
@TestSecurity(user = "b", roles = "b")
void testWithRole_b_throwsException() {
assertThrows(ForbiddenException.class, () -> testee.myMethod());
}
}
如果我能做这样的事情,我会更好:
@QuarkusTest
class MyTest {
@Inject
Testservice testee;
static Stream<TestUser> testUserDataProvider() {
return Stream.of(
new TestUser("a", "a"),
new TestUser("b", "b")
);
}
@ParameterizedTest
@MethodSource("testUserDataProvider")
void testWithRole_throwsException(TestUser testUser) {
TestSecurity annotation = new TestSecurity(testUser.username, testUser.role);
assertThrows(ForbiddenException.class, () -> testee.myMethod());
}
private record TestUser(String username, String role) {}
}
不幸的是,我在任何地方都没有找到类似的东西。
非常感谢和问候
不,这是不可能的,但你可以这样做:
@ParameterizedTest
@CsvSource(emptyValue = " ", textBlock = """
admin, admin, 200
wrongUser, wrongPassword, 401
correctUserWithWrongRole, 12345, 403
,,401
""")
void checkUser(String username, String password, int expectedStatus) {
given()
.header(CONTENT_TYPE, APPLICATION_JSON)
.auth().basic(username, password)
.when()
.get("/api/fruits")
.then()
.statusCode(expectedStatus);
}
@ParameterizedTest
@CsvSource(textBlock = """
GET, /api/fruits, 200
DELETE, /api/fruits, 403
GET, /api/forbidden-fruits, 403
//etc.
""")
@TestSecurity(user = "correctUser", roles = {"notAdmin", "user"})
void checkAuthorization(String method, String path, int expectedStatus) {
given()
.header(CONTENT_TYPE, APPLICATION_JSON)
when()
.request(method, path)
then()
.statusCode(expectedStatus);
}