From 1b239d600e8a6dd3db0cc2bf536b7e96ec23ee80 Mon Sep 17 00:00:00 2001
From: OZGCloud <ozgcloud@mgm-tp.com>
Date: Thu, 4 Jan 2024 13:46:51 +0100
Subject: [PATCH] OZG-4453 refactor dependency injection; adjust access
 modifier

---
 .../operator/keycloak/KeycloakClient.java     | 20 +++++++++++-----
 .../KeycloakGenericRemoteService.java         |  6 ++---
 .../KeycloakClientPreconditionService.java    |  6 ++---
 .../client/KeycloakClientReconciler.java      |  9 ++++----
 .../client/KeycloakClientRemoteService.java   |  6 ++---
 .../client/KeycloakClientService.java         | 15 +++++-------
 .../keycloak/group/KeycloakGroupMapper.java   |  5 ++--
 .../KeycloakGroupPreconditionService.java     | 13 +++++------
 .../group/KeycloakGroupReconciler.java        | 16 ++++++-------
 .../group/KeycloakGroupRemoteService.java     | 14 +++++------
 .../keycloak/group/KeycloakGroupService.java  | 12 +++++-----
 .../keycloak/realm/KeycloakRealmMapper.java   |  2 +-
 .../realm/KeycloakRealmReconciler.java        |  6 ++---
 .../realm/KeycloakRealmRemoteService.java     | 11 +++++----
 .../keycloak/realm/KeycloakRealmService.java  | 16 ++++++-------
 .../user/KeycloakUserPreconditionService.java |  6 ++---
 .../user/KeycloakUserRemoteService.java       |  9 ++++----
 .../keycloak/user/KeycloakUserService.java    | 13 +++++------
 .../user/KubernetesRemoteService.java         |  6 ++---
 .../operator/keycloak/KeycloakClientTest.java | 23 ++++++++++++++++---
 .../client/KeycloakClientReconcilerTest.java  |  4 ++--
 .../group/KeycloakGroupReconcilerTest.java    | 17 +++++++-------
 .../group/KeycloakGroupServiceTest.java       | 20 ++++++++--------
 23 files changed, 134 insertions(+), 121 deletions(-)

diff --git a/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/KeycloakClient.java b/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/KeycloakClient.java
index 8a92e32..28bba54 100644
--- a/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/KeycloakClient.java
+++ b/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/KeycloakClient.java
@@ -27,7 +27,6 @@ import java.util.Base64;
 
 import org.keycloak.admin.client.Keycloak;
 import org.keycloak.admin.client.KeycloakBuilder;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.context.annotation.Scope;
@@ -35,21 +34,30 @@ import org.springframework.context.annotation.Scope;
 import io.fabric8.kubernetes.api.model.Secret;
 import io.fabric8.kubernetes.client.KubernetesClient;
 import io.fabric8.kubernetes.client.dsl.Resource;
+import lombok.RequiredArgsConstructor;
 
+@RequiredArgsConstructor
 @Configuration
 public class KeycloakClient {
 
-	@Autowired
-	private KubernetesClient kubernetesClient;
+	private final KubernetesClient kubernetesClient;
 
 	@Bean
 	@Scope("singleton")
 	Keycloak createKeycloak() {
+		setProperties();
+		return buildKeycloak();
+	}
+
+	private void setProperties() {
 		System.setProperty("com.sun.xml.ws.transport.http.client.HttpTransportPipe.dump", "true");
 		System.setProperty("com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.dump", "true");
 		System.setProperty("com.sun.xml.ws.transport.http.HttpAdapter.dump", "true");
 		System.setProperty("com.sun.xml.internal.ws.transport.http.HttpAdapter.dump", "true");
 		System.setProperty("com.sun.xml.internal.ws.transport.http.HttpAdapter.dumpTreshold", "999999");
+	}
+
+	private Keycloak buildKeycloak() {
 		return KeycloakBuilder.builder()
 				.serverUrl("http://keycloak-keycloakx-http.keycloak")
 				.realm("master")
@@ -59,20 +67,20 @@ public class KeycloakClient {
 				.build();
 	}
 
-	String getKeycloakAdminPassword() {
+	private String getKeycloakAdminPassword() {
 		return decodeBase64(getKeycloakRealmAdminSecret()
 				.get()
 				.getData()
 				.get("password"));
 	}
 
-	Resource<Secret> getKeycloakRealmAdminSecret() {
+	private Resource<Secret> getKeycloakRealmAdminSecret() {
 		return kubernetesClient.secrets()
 				.inNamespace("keycloak")
 				.withName("keycloak-admin-secret");
 	}
 
-	String decodeBase64(String base64String) {
+	private String decodeBase64(String base64String) {
 		return new String(Base64.getDecoder().decode(base64String));
 	}
 }
diff --git a/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/KeycloakGenericRemoteService.java b/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/KeycloakGenericRemoteService.java
index fd1e5ad..2888571 100644
--- a/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/KeycloakGenericRemoteService.java
+++ b/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/KeycloakGenericRemoteService.java
@@ -31,17 +31,17 @@ import org.keycloak.admin.client.Keycloak;
 import org.keycloak.representations.idm.ClientRepresentation;
 import org.keycloak.representations.idm.RealmRepresentation;
 import org.keycloak.representations.idm.RoleRepresentation;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
+import lombok.RequiredArgsConstructor;
 import lombok.extern.java.Log;
 
+@RequiredArgsConstructor
 @Component
 @Log
 public class KeycloakGenericRemoteService {
 
-	@Autowired
-	private Keycloak keycloak;
+	private final Keycloak keycloak;
 
 	public Optional<ClientRepresentation> getByClientId(String clientId, String realm) {
 		return keycloak.realm(realm).clients().findAll().stream()
diff --git a/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/client/KeycloakClientPreconditionService.java b/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/client/KeycloakClientPreconditionService.java
index 93b4130..758ee22 100644
--- a/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/client/KeycloakClientPreconditionService.java
+++ b/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/client/KeycloakClientPreconditionService.java
@@ -25,16 +25,16 @@ package de.ozgcloud.operator.keycloak.client;
 
 import java.util.Optional;
 
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
 import de.ozgcloud.operator.keycloak.KeycloakGenericRemoteService;
+import lombok.RequiredArgsConstructor;
 
+@RequiredArgsConstructor
 @Component
 class KeycloakClientPreconditionService {
 
-	@Autowired
-	private KeycloakGenericRemoteService keycloakGenericRemoteService;
+	private final KeycloakGenericRemoteService keycloakGenericRemoteService;
 
 	Optional<String> getReconcilePreconditionErrors(OzgCloudKeycloakClient resource) {
 
diff --git a/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/client/KeycloakClientReconciler.java b/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/client/KeycloakClientReconciler.java
index 11f4f71..b881373 100644
--- a/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/client/KeycloakClientReconciler.java
+++ b/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/client/KeycloakClientReconciler.java
@@ -26,7 +26,6 @@ package de.ozgcloud.operator.keycloak.client;
 import java.util.Optional;
 import java.util.logging.Level;
 
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
 import de.ozgcloud.operator.Config;
@@ -35,18 +34,18 @@ import io.javaoperatorsdk.operator.api.reconciler.Context;
 import io.javaoperatorsdk.operator.api.reconciler.ControllerConfiguration;
 import io.javaoperatorsdk.operator.api.reconciler.Reconciler;
 import io.javaoperatorsdk.operator.api.reconciler.UpdateControl;
+import lombok.RequiredArgsConstructor;
 import lombok.extern.java.Log;
 
+@RequiredArgsConstructor
 @ControllerConfiguration
 @Component
 @Log
 public class KeycloakClientReconciler implements Reconciler<OzgCloudKeycloakClient> {
 
-	@Autowired
-	private KeycloakClientService service;
+	private final KeycloakClientService service;
 
-	@Autowired
-	private KeycloakClientPreconditionService preconditionService;
+	private final KeycloakClientPreconditionService preconditionService;
 
 	@Override
 	public UpdateControl<OzgCloudKeycloakClient> reconcile(OzgCloudKeycloakClient resource, Context<OzgCloudKeycloakClient> context) {
diff --git a/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/client/KeycloakClientRemoteService.java b/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/client/KeycloakClientRemoteService.java
index 7c3d4c1..7de2a81 100644
--- a/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/client/KeycloakClientRemoteService.java
+++ b/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/client/KeycloakClientRemoteService.java
@@ -31,18 +31,18 @@ import org.keycloak.admin.client.resource.ClientResource;
 import org.keycloak.admin.client.resource.RealmResource;
 import org.keycloak.representations.idm.ClientRepresentation;
 import org.keycloak.representations.idm.RoleRepresentation;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
 import de.ozgcloud.operator.keycloak.KeycloakResultParser;
+import lombok.RequiredArgsConstructor;
 import lombok.extern.java.Log;
 
+@RequiredArgsConstructor
 @Component
 @Log
 class KeycloakClientRemoteService {
 
-	@Autowired
-	private Keycloak keycloak;
+	private final Keycloak keycloak;
 
 	public void updateClient(ClientRepresentation client, String realm) {
 		getClientResource(realm, client.getId()).update(client);
diff --git a/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/client/KeycloakClientService.java b/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/client/KeycloakClientService.java
index 90e9671..3182648 100644
--- a/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/client/KeycloakClientService.java
+++ b/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/client/KeycloakClientService.java
@@ -26,25 +26,22 @@ package de.ozgcloud.operator.keycloak.client;
 import java.util.List;
 
 import org.keycloak.representations.idm.ClientRepresentation;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
 import de.ozgcloud.operator.keycloak.KeycloakGenericRemoteService;
+import lombok.RequiredArgsConstructor;
 
+@RequiredArgsConstructor
 @Component
 class KeycloakClientService {
 
-	@Autowired
-	private KeycloakClientRemoteService remoteService;
+	private final KeycloakClientRemoteService remoteService;
 
-	@Autowired
-	private KeycloakGenericRemoteService genericRemoteService;
+	private final KeycloakGenericRemoteService genericRemoteService;
 
-	@Autowired
-	private ProtocolMapperRepresentationHelper mapperRepresentationBuilder;
+	private final ProtocolMapperRepresentationHelper mapperRepresentationBuilder;
 
-	@Autowired
-	private KeycloakClientMapper mapper;
+	private final KeycloakClientMapper mapper;
 
 	void createOrUpdateClient(OzgCloudKeycloakClientSpec spec, String namespace) {
 		genericRemoteService.getByClientId(spec.getClientId(), namespace)
diff --git a/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/group/KeycloakGroupMapper.java b/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/group/KeycloakGroupMapper.java
index 519f661..7c7b782 100644
--- a/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/group/KeycloakGroupMapper.java
+++ b/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/group/KeycloakGroupMapper.java
@@ -38,10 +38,11 @@ import org.mapstruct.ReportingPolicy;
 interface KeycloakGroupMapper {
 
 	@Mapping(target = "attributes", source = "attributes", qualifiedByName = "mapAttributes")
-	GroupRepresentation map(OzgCloudKeycloakGroupSpec group);
+	public GroupRepresentation map(OzgCloudKeycloakGroupSpec group);
 
 	@Named("mapAttributes")
 	default Map<String, List<String>> mapAttributes(List<OzgCloudKeycloakGroupSpec.Attribute> attributes) {
-		return attributes.stream().collect(Collectors.toMap(OzgCloudKeycloakGroupSpec.Attribute::getName, attribute -> List.of(attribute.getValue())));
+		return attributes.stream()
+				.collect(Collectors.toMap(OzgCloudKeycloakGroupSpec.Attribute::getName, attribute -> List.of(attribute.getValue())));
 	}
 }
diff --git a/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/group/KeycloakGroupPreconditionService.java b/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/group/KeycloakGroupPreconditionService.java
index 0f6571b..56477e6 100644
--- a/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/group/KeycloakGroupPreconditionService.java
+++ b/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/group/KeycloakGroupPreconditionService.java
@@ -25,20 +25,19 @@ package de.ozgcloud.operator.keycloak.group;
 
 import java.util.Optional;
 
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
 import de.ozgcloud.operator.keycloak.KeycloakGenericRemoteService;
+import lombok.RequiredArgsConstructor;
 
+@RequiredArgsConstructor
 @Component
 class KeycloakGroupPreconditionService {
 
-	@Autowired
-	private KeycloakGenericRemoteService keycloakGenericRemoteService;
+	private final KeycloakGenericRemoteService keycloakGenericRemoteService;
 
-	Optional<String> getReconcilePreconditionErrors(OzgCloudKeycloakGroup resource) {
-
-		String namespace = resource.getMetadata().getNamespace();
+	public Optional<String> getReconcilePreconditionErrors(OzgCloudKeycloakGroup resource) {
+		var namespace = resource.getMetadata().getNamespace();
 
 		if (!keycloakGenericRemoteService.realmExists(namespace)) {
 			return Optional.of("Realm " + namespace + " does not yet exist");
@@ -46,4 +45,4 @@ class KeycloakGroupPreconditionService {
 
 		return Optional.empty();
 	}
-}
+}
\ No newline at end of file
diff --git a/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/group/KeycloakGroupReconciler.java b/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/group/KeycloakGroupReconciler.java
index 7388466..35bb8e3 100644
--- a/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/group/KeycloakGroupReconciler.java
+++ b/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/group/KeycloakGroupReconciler.java
@@ -26,7 +26,6 @@ package de.ozgcloud.operator.keycloak.group;
 import java.util.Optional;
 import java.util.logging.Level;
 
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
 import de.ozgcloud.operator.Config;
@@ -35,24 +34,23 @@ import io.javaoperatorsdk.operator.api.reconciler.Context;
 import io.javaoperatorsdk.operator.api.reconciler.ControllerConfiguration;
 import io.javaoperatorsdk.operator.api.reconciler.Reconciler;
 import io.javaoperatorsdk.operator.api.reconciler.UpdateControl;
+import lombok.RequiredArgsConstructor;
 import lombok.extern.java.Log;
 
+@RequiredArgsConstructor
 @ControllerConfiguration
 @Component
 @Log
 public class KeycloakGroupReconciler implements Reconciler<OzgCloudKeycloakGroup> {
 
-	@Autowired
-	private KeycloakGroupService service;
+	private final KeycloakGroupService service;
 
-	@Autowired
-	private KeycloakGroupPreconditionService preconditionService;
+	private final KeycloakGroupPreconditionService preconditionService;
 
 	@Override
 	public UpdateControl<OzgCloudKeycloakGroup> reconcile(OzgCloudKeycloakGroup resource, Context<OzgCloudKeycloakGroup> context) {
-
 		try {
-			String crdName = resource.getMetadata().getName();
+			var crdName = resource.getMetadata().getName();
 
 			log.info("Reconcile KeycloakGroup " + crdName);
 
@@ -74,12 +72,12 @@ public class KeycloakGroupReconciler implements Reconciler<OzgCloudKeycloakGroup
 		}
 	}
 
-	UpdateControl<OzgCloudKeycloakGroup> buildStatusOk(OzgCloudKeycloakGroup resource) {
+	private UpdateControl<OzgCloudKeycloakGroup> buildStatusOk(OzgCloudKeycloakGroup resource) {
 		resource.setStatus(OzgCloudKeycloakGroupStatus.builder().status(OzgCloudCustomResourceStatus.OK).message(null).build());
 		return UpdateControl.updateStatus(resource);
 	}
 
-	UpdateControl<OzgCloudKeycloakGroup> buildStatusInProgress(OzgCloudKeycloakGroup resource, String errorMessage) {
+	private UpdateControl<OzgCloudKeycloakGroup> buildStatusInProgress(OzgCloudKeycloakGroup resource, String errorMessage) {
 		log.log(Level.INFO,
 				"Could not yet reconcile group " + resource.getMetadata().getName() + " in namespace " + resource.getMetadata().getNamespace() + ": "
 						+ errorMessage);
diff --git a/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/group/KeycloakGroupRemoteService.java b/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/group/KeycloakGroupRemoteService.java
index af4c33a..842187a 100644
--- a/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/group/KeycloakGroupRemoteService.java
+++ b/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/group/KeycloakGroupRemoteService.java
@@ -27,32 +27,30 @@ import java.util.Objects;
 import java.util.Optional;
 import java.util.logging.Level;
 
-import javax.ws.rs.core.Response;
-
 import org.keycloak.admin.client.Keycloak;
 import org.keycloak.representations.idm.GroupRepresentation;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
 import de.ozgcloud.operator.keycloak.KeycloakResultParser;
+import lombok.RequiredArgsConstructor;
 import lombok.extern.java.Log;
 
+@RequiredArgsConstructor
 @Component
 @Log
 class KeycloakGroupRemoteService {
 
-	@Autowired
-	private Keycloak keycloak;
+	private final Keycloak keycloak;
 
-	Optional<GroupRepresentation> getGroupByName(String groupName, String realm) {
+	public Optional<GroupRepresentation> getGroupByName(String groupName, String realm) {
 		return keycloak.realm(realm).groups().groups()
 				.stream().filter(group -> Objects.equals(groupName, group.getName()))
 				.findFirst();
 	}
 
-	void createGroup(GroupRepresentation group, String realm) {
+	public void createGroup(GroupRepresentation group, String realm) {
 		log.log(Level.FINE, "Creating group {0} in realm {1}", new Object[] { group.getName(), realm });
-		Response response = keycloak.realm(realm).groups().add(group);
+		var response = keycloak.realm(realm).groups().add(group);
 		KeycloakResultParser.parseCreatedResponse(response);
 	}
 }
diff --git a/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/group/KeycloakGroupService.java b/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/group/KeycloakGroupService.java
index 4eaa2ed..e8783ff 100644
--- a/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/group/KeycloakGroupService.java
+++ b/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/group/KeycloakGroupService.java
@@ -25,19 +25,19 @@ package de.ozgcloud.operator.keycloak.group;
 
 import java.util.Optional;
 
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
+import lombok.RequiredArgsConstructor;
+
+@RequiredArgsConstructor
 @Component
 class KeycloakGroupService {
 
-	@Autowired
-	private KeycloakGroupRemoteService remoteService;
+	private final KeycloakGroupRemoteService remoteService;
 
-	@Autowired
-	private KeycloakGroupMapper mapper;
+	private final KeycloakGroupMapper mapper;
 
-	void createGroup(OzgCloudKeycloakGroupSpec group, String realm) {
+	public void createGroup(OzgCloudKeycloakGroupSpec group, String realm) {
 		Optional.of(group)
 				.map(mapper::map)
 				.filter(groupRepresentation -> remoteService.getGroupByName(group.getName(), realm).isEmpty())
diff --git a/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmMapper.java b/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmMapper.java
index 8b5e7be..5af8764 100644
--- a/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmMapper.java
+++ b/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmMapper.java
@@ -41,7 +41,7 @@ interface KeycloakRealmMapper {
 	@Mapping(target = "defaultLocale", constant = "de")
 	@Mapping(target = "internationalizationEnabled", constant = "true")
 	@Mapping(target = "passwordPolicy", constant = "upperCase(1) and lowerCase(1) and length(8) and notUsername")
-	RealmRepresentation map(OzgCloudKeycloakRealmSpec realm);
+	public RealmRepresentation map(OzgCloudKeycloakRealmSpec realm);
 
 	@Named("supportedLocales")
 	default Set<String> mapPassword(OzgCloudKeycloakRealmSpec spec) {
diff --git a/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmReconciler.java b/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmReconciler.java
index 4b62b2b..2524770 100644
--- a/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmReconciler.java
+++ b/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmReconciler.java
@@ -25,7 +25,6 @@ package de.ozgcloud.operator.keycloak.realm;
 
 import java.util.logging.Level;
 
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
 import de.ozgcloud.operator.Config;
@@ -36,15 +35,16 @@ import io.javaoperatorsdk.operator.api.reconciler.ControllerConfiguration;
 import io.javaoperatorsdk.operator.api.reconciler.DeleteControl;
 import io.javaoperatorsdk.operator.api.reconciler.Reconciler;
 import io.javaoperatorsdk.operator.api.reconciler.UpdateControl;
+import lombok.RequiredArgsConstructor;
 import lombok.extern.java.Log;
 
+@RequiredArgsConstructor
 @ControllerConfiguration
 @Component
 @Log
 public class KeycloakRealmReconciler implements Reconciler<OzgCloudKeycloakRealm>, Cleaner<OzgCloudKeycloakRealm> {
 
-	@Autowired
-	private KeycloakRealmService service;
+	private final KeycloakRealmService service;
 
 	@Override
 	public UpdateControl<OzgCloudKeycloakRealm> reconcile(OzgCloudKeycloakRealm resource, Context<OzgCloudKeycloakRealm> context) {
diff --git a/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmRemoteService.java b/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmRemoteService.java
index 97801f7..124f1d5 100644
--- a/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmRemoteService.java
+++ b/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmRemoteService.java
@@ -25,20 +25,21 @@ package de.ozgcloud.operator.keycloak.realm;
 
 import org.keycloak.admin.client.Keycloak;
 import org.keycloak.representations.idm.RealmRepresentation;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
+import lombok.RequiredArgsConstructor;
+
+@RequiredArgsConstructor
 @Component
 class KeycloakRealmRemoteService {
 
-	@Autowired
-	Keycloak keycloak;
+	private final Keycloak keycloak;
 
-	void createRealm(RealmRepresentation realm) {
+	public void createRealm(RealmRepresentation realm) {
 		keycloak.realms().create(realm);
 	}
 
-	void deleteRealm(String realmName) {
+	public void deleteRealm(String realmName) {
 		keycloak.realm(realmName).remove();
 	}
 }
diff --git a/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmService.java b/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmService.java
index 6911ce5..279a055 100644
--- a/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmService.java
+++ b/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmService.java
@@ -26,24 +26,22 @@ package de.ozgcloud.operator.keycloak.realm;
 import java.util.Optional;
 
 import org.keycloak.representations.idm.RealmRepresentation;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
 import de.ozgcloud.operator.keycloak.KeycloakGenericRemoteService;
+import lombok.RequiredArgsConstructor;
 
+@RequiredArgsConstructor
 @Component
 class KeycloakRealmService {
 
-	@Autowired
-	private KeycloakRealmRemoteService remoteService;
+	private final KeycloakRealmRemoteService remoteService;
 
-	@Autowired
-	private KeycloakRealmMapper mapper;
+	private final KeycloakRealmMapper mapper;
 
-	@Autowired
-	private KeycloakGenericRemoteService keycloakGenericRemoteService;
+	private final KeycloakGenericRemoteService keycloakGenericRemoteService;
 
-	void createRealm(OzgCloudKeycloakRealmSpec realm, String realmName) {
+	public void createRealm(OzgCloudKeycloakRealmSpec realm, String realmName) {
 		Optional.of(realm)
 				.map(mapper::map)
 				.map(realmRepresentation -> addRealmName(realmRepresentation, realmName))
@@ -56,7 +54,7 @@ class KeycloakRealmService {
 		return realm;
 	}
 
-	void deleteRealm(String realmName) {
+	public void deleteRealm(String realmName) {
 		remoteService.deleteRealm(realmName);
 	}
 }
diff --git a/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/user/KeycloakUserPreconditionService.java b/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/user/KeycloakUserPreconditionService.java
index 6366465..a2a19c6 100644
--- a/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/user/KeycloakUserPreconditionService.java
+++ b/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/user/KeycloakUserPreconditionService.java
@@ -25,18 +25,18 @@ package de.ozgcloud.operator.keycloak.user;
 
 import java.util.Optional;
 
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
 import de.ozgcloud.operator.keycloak.KeycloakGenericRemoteService;
 import de.ozgcloud.operator.keycloak.user.OzgCloudKeycloakUserSpec.KeycloakUserSpecClientRole;
 import de.ozgcloud.operator.keycloak.user.OzgCloudKeycloakUserSpec.KeycloakUserSpecUserGroup;
+import lombok.RequiredArgsConstructor;
 
+@RequiredArgsConstructor
 @Component
 class KeycloakUserPreconditionService {
 
-	@Autowired
-	private KeycloakGenericRemoteService keycloakGenericRemoteService;
+	private final KeycloakGenericRemoteService keycloakGenericRemoteService;
 
 	public Optional<String> getPreconditionErrors(OzgCloudKeycloakUser user) {
 		var namespace = user.getMetadata().getNamespace();
diff --git a/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/user/KeycloakUserRemoteService.java b/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/user/KeycloakUserRemoteService.java
index 4e1d2f0..b38218f 100644
--- a/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/user/KeycloakUserRemoteService.java
+++ b/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/user/KeycloakUserRemoteService.java
@@ -32,21 +32,20 @@ import org.keycloak.admin.client.resource.RealmResource;
 import org.keycloak.representations.idm.ClientRepresentation;
 import org.keycloak.representations.idm.RoleRepresentation;
 import org.keycloak.representations.idm.UserRepresentation;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
 import de.ozgcloud.operator.keycloak.KeycloakException;
 import de.ozgcloud.operator.keycloak.KeycloakGenericRemoteService;
 import de.ozgcloud.operator.keycloak.KeycloakResultParser;
+import lombok.RequiredArgsConstructor;
 
+@RequiredArgsConstructor
 @Component
 class KeycloakUserRemoteService {
 
-	@Autowired
-	private Keycloak keycloak;
+	private final Keycloak keycloak;
 
-	@Autowired
-	private KeycloakGenericRemoteService keycloakGenericRemoteService;
+	private final KeycloakGenericRemoteService keycloakGenericRemoteService;
 
 	public void createUser(UserRepresentation user, String namespace) {
 		var realmResource = getRealm(namespace);
diff --git a/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/user/KeycloakUserService.java b/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/user/KeycloakUserService.java
index 13e2cb9..c8343f8 100644
--- a/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/user/KeycloakUserService.java
+++ b/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/user/KeycloakUserService.java
@@ -26,20 +26,19 @@ package de.ozgcloud.operator.keycloak.user;
 import java.util.Optional;
 
 import org.apache.commons.lang3.StringUtils;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
+import lombok.RequiredArgsConstructor;
+
+@RequiredArgsConstructor
 @Component
 class KeycloakUserService {
 
-	@Autowired
-	private KeycloakUserRemoteService remoteService;
+	private final KeycloakUserRemoteService remoteService;
 
-	@Autowired
-	private UserSecretService userSecretService;
+	private final UserSecretService userSecretService;
 
-	@Autowired
-	private KeycloakUserMapper userMapper;
+	private final KeycloakUserMapper userMapper;
 
 	public void createOrUpdateUser(OzgCloudKeycloakUserSpec userSpec, String namespace) {
 
diff --git a/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/user/KubernetesRemoteService.java b/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/user/KubernetesRemoteService.java
index c865115..e7988e4 100644
--- a/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/user/KubernetesRemoteService.java
+++ b/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/user/KubernetesRemoteService.java
@@ -1,19 +1,19 @@
 package de.ozgcloud.operator.keycloak.user;
 
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
 import io.fabric8.kubernetes.api.model.Secret;
 import io.fabric8.kubernetes.client.KubernetesClient;
 import io.fabric8.kubernetes.client.dsl.Resource;
+import lombok.RequiredArgsConstructor;
 import lombok.extern.java.Log;
 
+@RequiredArgsConstructor
 @Log
 @Component
 class KubernetesRemoteService {
 
-	@Autowired
-	private KubernetesClient kubernetesClient;
+	private final KubernetesClient kubernetesClient;
 
 	public Resource<Secret> getSecret(String namespace, String name) {
 		log.info(String.format("KubernetesClient: Get %s secret from %s namespace.", name, namespace));
diff --git a/ozgcloud-keycloak-operator/src/test/java/de/ozgcloud/operator/keycloak/KeycloakClientTest.java b/ozgcloud-keycloak-operator/src/test/java/de/ozgcloud/operator/keycloak/KeycloakClientTest.java
index 9ac65f4..64d1be6 100644
--- a/ozgcloud-keycloak-operator/src/test/java/de/ozgcloud/operator/keycloak/KeycloakClientTest.java
+++ b/ozgcloud-keycloak-operator/src/test/java/de/ozgcloud/operator/keycloak/KeycloakClientTest.java
@@ -23,12 +23,29 @@
  */
 package de.ozgcloud.operator.keycloak;
 
+import static org.assertj.core.api.Assertions.*;
+
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.api.Nested;
 import org.junit.jupiter.api.Test;
+import org.mockito.Mock;
+
+import io.fabric8.kubernetes.client.KubernetesClient;
 
 class KeycloakClientTest {
 
-	@Test
-	void shouldInitKeycloakClient() {
-		new KeycloakClient();
+	@DisplayName("Create keycloak")
+	@Nested
+	class TestCreateKeycloak {
+
+		@Mock
+		private KubernetesClient kubernetsClient;
+
+		@Test
+		void shouldInitKeycloakClient() {
+			var keycloak = new KeycloakClient(kubernetsClient);
+
+			assertThat(keycloak).isNotNull();
+		}
 	}
 }
diff --git a/ozgcloud-keycloak-operator/src/test/java/de/ozgcloud/operator/keycloak/client/KeycloakClientReconcilerTest.java b/ozgcloud-keycloak-operator/src/test/java/de/ozgcloud/operator/keycloak/client/KeycloakClientReconcilerTest.java
index c8f4113..01b9a7c 100644
--- a/ozgcloud-keycloak-operator/src/test/java/de/ozgcloud/operator/keycloak/client/KeycloakClientReconcilerTest.java
+++ b/ozgcloud-keycloak-operator/src/test/java/de/ozgcloud/operator/keycloak/client/KeycloakClientReconcilerTest.java
@@ -39,8 +39,6 @@ import de.ozgcloud.operator.keycloak.OzgCloudCustomResourceStatus;
 
 class KeycloakClientReconcilerTest {
 
-	public static final String ERROR_MESSAGE = "ErrorMessage";
-
 	@Spy
 	@InjectMocks
 	private KeycloakClientReconciler reconciler;
@@ -54,6 +52,8 @@ class KeycloakClientReconcilerTest {
 	@Nested
 	class TestReconcile {
 
+		private static final String ERROR_MESSAGE = "ErrorMessage";
+
 		@Test
 		void shouldCallServiceAddClient() {
 			OzgCloudKeycloakClient client = OzgCloudKeycloakClientTestFactory.create();
diff --git a/ozgcloud-keycloak-operator/src/test/java/de/ozgcloud/operator/keycloak/group/KeycloakGroupReconcilerTest.java b/ozgcloud-keycloak-operator/src/test/java/de/ozgcloud/operator/keycloak/group/KeycloakGroupReconcilerTest.java
index c4eca85..5e02bd5 100644
--- a/ozgcloud-keycloak-operator/src/test/java/de/ozgcloud/operator/keycloak/group/KeycloakGroupReconcilerTest.java
+++ b/ozgcloud-keycloak-operator/src/test/java/de/ozgcloud/operator/keycloak/group/KeycloakGroupReconcilerTest.java
@@ -39,8 +39,6 @@ import de.ozgcloud.operator.keycloak.OzgCloudCustomResourceStatus;
 
 class KeycloakGroupReconcilerTest {
 
-	public static final String ERROR_MESSAGE = "ErrorMessage";
-
 	@Spy
 	@InjectMocks
 	private KeycloakGroupReconciler reconciler;
@@ -54,25 +52,26 @@ class KeycloakGroupReconcilerTest {
 	@Nested
 	class TestReconcile {
 
+		private static final String ERROR_MESSAGE = "ErrorMessage";
+		private static final OzgCloudKeycloakGroup KEYCLOAK_GROUP = OzgCloudKeycloakGroupTestFactory.create();
+
 		@Test
 		void shouldCallServiceAddGroup() {
-			OzgCloudKeycloakGroup group = OzgCloudKeycloakGroupTestFactory.create();
-
-			reconciler.reconcile(group, null);
+			reconciler.reconcile(KEYCLOAK_GROUP, null);
 
-			verify(service).createGroup(group.getSpec(), OzgCloudKeycloakGroupTestFactory.METADATA_NAMESPACE);
+			verify(service).createGroup(KEYCLOAK_GROUP.getSpec(), OzgCloudKeycloakGroupTestFactory.METADATA_NAMESPACE);
 		}
 
 		@Test
 		void shouldReturnUpdateStatus() {
-			var response = reconciler.reconcile(OzgCloudKeycloakGroupTestFactory.create(), null);
+			var response = reconciler.reconcile(KEYCLOAK_GROUP, null);
 
 			assertThat(response.getResource()).isNotNull();
 		}
 
 		@Test
 		void shouldSetStatusOk() {
-			var response = reconciler.reconcile(OzgCloudKeycloakGroupTestFactory.create(), null);
+			var response = reconciler.reconcile(KEYCLOAK_GROUP, null);
 
 			assertThat(response.getResource().getStatus().getStatus()).isEqualTo(OzgCloudCustomResourceStatus.OK);
 		}
@@ -81,7 +80,7 @@ class KeycloakGroupReconcilerTest {
 		void shouldReturnInProgressStatusIfPreconditionsNotMet() {
 			when(preconditionService.getReconcilePreconditionErrors(any())).thenReturn(Optional.of(ERROR_MESSAGE));
 
-			var response = reconciler.reconcile(OzgCloudKeycloakGroupTestFactory.create(), null);
+			var response = reconciler.reconcile(KEYCLOAK_GROUP, null);
 
 			assertThat(response.getResource().getStatus().getStatus()).isEqualTo(OzgCloudCustomResourceStatus.IN_PROGRESS);
 		}
diff --git a/ozgcloud-keycloak-operator/src/test/java/de/ozgcloud/operator/keycloak/group/KeycloakGroupServiceTest.java b/ozgcloud-keycloak-operator/src/test/java/de/ozgcloud/operator/keycloak/group/KeycloakGroupServiceTest.java
index 1bc024a..b78cb0f 100644
--- a/ozgcloud-keycloak-operator/src/test/java/de/ozgcloud/operator/keycloak/group/KeycloakGroupServiceTest.java
+++ b/ozgcloud-keycloak-operator/src/test/java/de/ozgcloud/operator/keycloak/group/KeycloakGroupServiceTest.java
@@ -52,43 +52,43 @@ class KeycloakGroupServiceTest {
 	@Nested
 	class TestCreateGroup {
 
+		private final static OzgCloudKeycloakGroupSpec KEYCLOAK_GROUP = OzgCloudKeycloakGroupSpecTestFactory.create();
+
 		@Test
 		void shouldCallGetGroupRemoteService() {
 			var groupRepresentation = GroupRepresentationTestFactory.create();
 			when(mapper.map(any())).thenReturn(groupRepresentation);
 
-			service.createGroup(OzgCloudKeycloakGroupSpecTestFactory.create(), REALM);
+			service.createGroup(KEYCLOAK_GROUP, REALM);
 
 			verify(remoteService).getGroupByName(OzgCloudKeycloakGroupSpecTestFactory.NAME, REALM);
 		}
 
 		@Test
 		void shouldCallMapper() {
-			var group = OzgCloudKeycloakGroupSpecTestFactory.create();
-			service.createGroup(group, REALM);
 
-			verify(mapper).map(group);
+			service.createGroup(KEYCLOAK_GROUP, REALM);
+
+			verify(mapper).map(KEYCLOAK_GROUP);
 		}
 
 		@Test
 		void shouldCreateGroupIfNotExists() {
-			var ozgGroup = OzgCloudKeycloakGroupSpecTestFactory.create();
 			var groupRepresentation = GroupRepresentationTestFactory.create();
 			when(remoteService.getGroupByName(OzgCloudKeycloakGroupSpecTestFactory.NAME, REALM)).thenReturn(Optional.empty());
-			when(mapper.map(ozgGroup)).thenReturn(groupRepresentation);
+			when(mapper.map(KEYCLOAK_GROUP)).thenReturn(groupRepresentation);
 
-			service.createGroup(ozgGroup, REALM);
+			service.createGroup(KEYCLOAK_GROUP, REALM);
 
 			verify(remoteService).createGroup(groupRepresentation, REALM);
 		}
 
 		@Test
 		void shouldNotCreateGroupIfAlreadyExists() {
-			var ozgGroup = OzgCloudKeycloakGroupSpecTestFactory.create();
 			when(remoteService.getGroupByName(OzgCloudKeycloakGroupSpecTestFactory.NAME, REALM)).thenReturn(Optional.of(mock(GroupRepresentation.class)));
-			when(mapper.map(ozgGroup)).thenReturn(GroupRepresentationTestFactory.create());
+			when(mapper.map(KEYCLOAK_GROUP)).thenReturn(GroupRepresentationTestFactory.create());
 
-			service.createGroup(ozgGroup, REALM);
+			service.createGroup(KEYCLOAK_GROUP, REALM);
 
 			verify(remoteService, never()).createGroup(any(), anyString());
 		}
-- 
GitLab