#java #spring-boot #unit-testing #graphql #junit5
Вопрос:
Я реализовал директиву в соответствии с этой документацией в своем проекте загрузки graphql spring. Это точно то же самое, что и директива @auth, упомянутая в документации. Класс реализации выглядит следующим образом —
class AuthorisationDirective implements SchemaDirectiveWiring {
@Override
public GraphQLFieldDefinition onField(SchemaDirectiveWiringEnvironment<GraphQLFieldDefinition> environment) {
String targetAuthRole = (String) environment.getDirective().getArgument("role").getValue();
GraphQLFieldDefinition field = environment.getElement();
GraphQLFieldsContainer parentType = environment.getFieldsContainer();
//
// build a data fetcher that first checks authorisation roles before then calling the original data fetcher
//
DataFetcher originalDataFetcher = environment.getCodeRegistry().getDataFetcher(parentType, field);
DataFetcher authDataFetcher = new DataFetcher() {
@Override
public Object get(DataFetchingEnvironment dataFetchingEnvironment) throws Exception {
Map<String, Object> contextMap = dataFetchingEnvironment.getContext();
AuthorisationCtx authContext = (AuthorisationCtx) contextMap.get("authContext");
if (authContext.hasRole(targetAuthRole)) {
return originalDataFetcher.get(dataFetchingEnvironment);
} else {
return null;
}
}
};
//
// now change the field definition to have the new authorising data fetcher
environment.getCodeRegistry().dataFetcher(parentType, field, authDataFetcher);
return field;
}
}
На самом деле я не могу охватить следующие строки кода с помощью UT. К вашему сведению, следующие строки будут выполняться после запроса.
DataFetcher authDataFetcher = new DataFetcher() {
@Override
public Object get(DataFetchingEnvironment dataFetchingEnvironment) {
Map<String, Object> contextMap = dataFetchingEnvironment.getContext();
AuthorisationCtx authContext = (AuthorisationCtx) contextMap.get("authContext");
if (authContext.hasRole(targetAuthRole)) {
return originalDataFetcher.get(dataFetchingEnvironment);
} else {
return null;
}
}
};
Пожалуйста, помогите. Заранее спасибо.