我正在为AdminClientService创建测试,它会将用户创建到Keycloak数据库中。在主要处理过程中,它按应有的方式工作,但在创建测试时,我遇到了这个异常:
java.lang.NullPointerException: RESTEASY004645: templateValues entry was null
at com.springboot.services.KeycloakAdminClientServiceTest.createKeycloakUserTest(KeycloakAdminClientServiceTest.java:80)
下面是测试,我目前正在运行:
@SpringBootTest
public class KeycloakAdminClientServiceTest {
@Value("${keycloak.auth-server-url}")
public String serverUrl;
@Value("${keycloak.realm}")
public String realm;
@Value("${keycloak.resource}")
public String clientId;
@Value("${keycloak.credentials.secret}")
public String clientSecret;
// @Mock
// KeycloakProvider kcProvider = Mockito.mock(KeycloakProvider.class);
// @InjectMocks
//
// @BeforeEach
// void setMockOutput() {
// //when(helloService.get()).thenReturn("Hello Mockito");
// Mockito.when(kcProvider.getInstance()).thenReturn(KeycloakBuilder.builder()
// .realm(realm)
// .serverUrl(serverUrl)
// .clientId(clientId)
// .clientSecret(clientSecret)
// .grantType(OAuth2Constants.CLIENT_CREDENTIALS)
// .build());
// }
KeycloakProvider kcProvider;
KeycloakAdminClientService kcAdminClientService;
@BeforeEach
void createKeycloakProvider() {
kcProvider = new KeycloakProvider();
kcProvider.setServerUrl(serverUrl);
kcProvider.setRealm(realm);
kcProvider.setClientId(clientId);
kcProvider.setClientSecret(clientSecret);
kcAdminClientService = new KeycloakAdminClientService(kcProvider);
}
@Test
public void createKeycloakUserTest(){
Integer generatedInteger = (int) ((Math.random() * (9999999 - 1000000)) + 1000000);
String generatedString = generatedInteger.toString();
CreateUserRequest createUserRequest = new CreateUserRequest();
createUserRequest.setUsername("admin_client_username_" + generatedString);
createUserRequest.setPassword("admin_client_password");
createUserRequest.setEmail("admin_client_email_" + generatedString + "@gmail.com");
createUserRequest.setFirstname("admin_client_firstname_" + generatedString);
createUserRequest.setLastname("admin_client_lastname_" + generatedString);
kcAdminClientService.createKeycloakUser(createUserRequest);
UsersResource usersResource = kcProvider.getInstance()
.realm(kcAdminClientService.realm).users();
List<UserRepresentation> userRepresentation = usersResource
.search("admin_client_email_" + generatedString + "@gmail.com");
assertNotNull(userRepresentation);
assertEquals("admin_client_firstname_" + generatedString,
userRepresentation.get(0).getFirstName());
}
}
以下是服务:
@Service
public class KeycloakAdminClientService {
@Value("${keycloak.realm}")
public String realm;
private final KeycloakProvider kcProvider;
public KeycloakAdminClientService(KeycloakProvider keycloakProvider) {
this.kcProvider = keycloakProvider;
}
public Response createKeycloakUser(CreateUserRequest user) {
UsersResource usersResource = kcProvider.getInstance().realm(realm).users();
CredentialRepresentation credentialRepresentation = createPasswordCredentials(
user.getPassword());
UserRepresentation kcUser = new UserRepresentation();
kcUser.setUsername(user.getEmail());
kcUser.setCredentials(Collections.singletonList(credentialRepresentation));
kcUser.setFirstName(user.getFirstname());
kcUser.setLastName(user.getLastname());
kcUser.setEmail(user.getEmail());
kcUser.setEnabled(true);
kcUser.setEmailVerified(false);
Response response = usersResource.create(kcUser);
return response;
}
private static CredentialRepresentation createPasswordCredentials(String password) {
CredentialRepresentation passwordCredentials = new CredentialRepresentation();
passwordCredentials.setTemporary(false);
passwordCredentials.setType(CredentialRepresentation.PASSWORD);
passwordCredentials.setValue(password);
return passwordCredentials;
}
}
KeycloakProvider:
@Configuration
@Getter
@Setter
public class KeycloakProvider {
@Value("${keycloak.auth-server-url}")
public String serverUrl;
@Value("${keycloak.realm}")
public String realm;
@Value("${keycloak.resource}")
public String clientId;
@Value("${keycloak.credentials.secret}")
public String clientSecret;
private static Keycloak keycloak = null;
public KeycloakProvider() {
}
public Keycloak getInstance() {
if (keycloak == null) {
return KeycloakBuilder.builder()
.realm(realm)
.serverUrl(serverUrl)
.clientId(clientId)
.clientSecret(clientSecret)
.grantType(OAuth2Constants.CLIENT_CREDENTIALS)
.build();
}
return keycloak;
}
public KeycloakBuilder newKeycloakBuilderWithPasswordCredentials(
String username,
String password) {
return KeycloakBuilder.builder()
.realm(realm)
.serverUrl(serverUrl)
.clientId(clientId)
.clientSecret(clientSecret)
.username(username)
.password(password);
}
public JsonNode refreshToken(String refreshToken) throws UnirestException {
String url = serverUrl + "/realms/" + realm + "/protocol/openid-connect/token";
return Unirest.post(url)
.header("Content-Type", "application/x-www-form-urlencoded")
.field("client_id", clientId)
.field("client_secret", clientSecret)
.field("refresh_token", refreshToken)
.field("grant_type", "refresh_token")
.asJson().getBody();
}
}
我试着用Mockito来解决这个问题,但意识到它不会起作用,正如我所希望的那样。
发布于 2022-11-02 12:07:10
我自己解决它,而不是上面的代码,你应该写成那样,应该写@Autowired。
@Autowired
KeycloakProvider kcProvider;
@Autowired
KeycloakAdminClientService kcAdminClientService;
它将解决所有的问题)
https://stackoverflow.com/questions/74280783
复制相似问题