dasniko / testcontainers-keycloak

A Testcontainer implementation for Keycloak IAM & SSO.
Apache License 2.0
328 stars 51 forks source link

The elements [keycloak.client-id] were left unbound. #46

Closed fintans closed 2 years ago

fintans commented 2 years ago

Hi,

Could you please help with the above error, I am not sure what I am doing wrong. Please ask if you want me to provide any more info/code

Initializer:

public class KeyCloakTestContext implements ApplicationContextInitializer<ConfigurableApplicationContext> {

    KeycloakContainer keycloakContainer;

    @Override
    public void initialize(ConfigurableApplicationContext applicationContext) {
        keycloakContainer = new KeycloakContainer();
        keycloakContainer.withAdminUsername("john").withAdminPassword("pw");
        keycloakContainer.start();

        System.setProperty("keycloak.auth-server-url", keycloakContainer.getAuthServerUrl());
        System.setProperty("keycloak.realm", "SpringBootKeycloak");
        System.setProperty("keycloak.resource", "login-app");
        System.setProperty("keycloak.public-client", "true");
        System.setProperty("keycloak.client-id", "hi");
    }
}

Test class:

@SpringBootTest(
        classes = TaxApplication.class,
        webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@Testcontainers
@ContextConfiguration(initializers = KeyCloakTestContext.class)
class Testy {

    @Autowired
    private TestRestTemplate restTemplate;

    @Autowired
    AccessTokenProvider accessTokenProvider;

    @Container
    public static CustomMySqlContainer mySqlContainer = CustomMySqlContainer.getInstance().withInitScript("database/schema.sql");

    @Container
    private KeycloakContainer keycloak = new KeycloakContainer("jboss/keycloak:15.0.2");
    @Test
    public void test_endpoint() {

        String token = accessTokenProvider.getAccessToken("john", "pw", "hi", "SpringBootKeycloak");
        restTemplate.getRestTemplate().setInterceptors(
                Collections.singletonList((request, body, execution) -> {
                    request.getHeaders()
                            .add("Authorization", "Bearer "+token);
                    return execution.execute(request, body);
                }));

        ResponseEntity<String> customerResponse = restTemplate.getForEntity("/api/test", String.class);

        assertThat(customerResponse.getStatusCode(), is(HttpStatus.OK));

    }
}

application.properties file

keycloak.auth-server-url=http://localhost:8000
keycloak.realm=SpringBootKeycloak
keycloak.resource=login-app
keycloak.client-id=hi
keycloak.public-client=true

Error

Binding to target [Bindable@68f2363 type = org.keycloak.adapters.springboot.KeycloakSpringBootProperties, value = 'provided', annotations = array<Annotation>[@org.springframework.boot.context.properties.ConfigurationProperties(ignoreInvalidFields=false, ignoreUnknownFields=false, prefix=keycloak, value=keycloak)]] failed:

    Property: keycloak.client-id
    Value: hi
    Origin: class path resource [application.properties] - 4:20
    Reason: The elements [keycloak.client-id] were left unbound.

Action:

Update your application's configuration