Skip to content

mocked quarkus-rest-client complains about missing uri #47383

@Postremus

Description

@Postremus

Describe the bug

I can not mock rest clients. Quarkus complaints about the uri not being set. But I do not want to set the uri, since I am mocking the result of the client anyway.

@QuarkusTest
class GreetingResourceTest {

    @InjectMock
    @RestClient
    MyRemoteService myRemoteService;
[...]

Results in the log from below.

I can work around this by adding

%test.quarkus.rest-client."org.acme.MyRemoteService".url=http://localhost:8080/i-do-not-exist

To my application.properties.

See doc: https://quarkus.io/guides/rest-client#mocking-with-injectmock

Expected behavior

I can mock quarkus rest clients inn my quarkustest

Actual behavior

2025-04-15 17:51:02,863 INFO  [io.quarkus] (main) rest-client-mock 1.0.0-SNAPSHOT on JVM (powered by Quarkus 3.21.2) started in 4.370s. Listening on: http://localhost:8081
2025-04-15 17:51:02,867 INFO  [io.quarkus] (main) Profile test activated. 
2025-04-15 17:51:02,867 INFO  [io.quarkus] (main) Installed features: [cdi, rest, rest-client, rest-client-jackson, smallrye-context-propagation, vertx]

org.junit.jupiter.api.extension.TestInstantiationException: Failed to create test instance

	at io.quarkus.test.junit.QuarkusTestExtension.initTestState(QuarkusTestExtension.java:767)
	at io.quarkus.test.junit.QuarkusTestExtension.interceptTestClassConstructor(QuarkusTestExtension.java:733)
	at java.base/java.util.Optional.orElseGet(Optional.java:364)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1597)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1597)
Caused by: java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
	at io.quarkus.runner.bootstrap.RunningQuarkusApplicationImpl.instance(RunningQuarkusApplicationImpl.java:90)
	at io.quarkus.test.junit.QuarkusTestExtension.createActualTestInstance(QuarkusTestExtension.java:773)
	at io.quarkus.test.junit.QuarkusTestExtension.initTestState(QuarkusTestExtension.java:761)
	... 4 more
Caused by: java.lang.reflect.InvocationTargetException
	at java.base/java.lang.reflect.Method.invoke(Method.java:580)
	at io.quarkus.runner.bootstrap.RunningQuarkusApplicationImpl.instance(RunningQuarkusApplicationImpl.java:88)
	... 6 more
Caused by: java.lang.RuntimeException: Error injecting org.acme.GreetingResource org.acme.GreetingResourceTest.greetingResource
	at org.acme.GreetingResourceTest_Bean.doCreate(Unknown Source)
	at org.acme.GreetingResourceTest_Bean.create(Unknown Source)
	at org.acme.GreetingResourceTest_Bean.get(Unknown Source)
	at org.acme.GreetingResourceTest_Bean.get(Unknown Source)
	at io.quarkus.arc.impl.InstanceImpl.getBeanInstance(InstanceImpl.java:325)
	at io.quarkus.arc.impl.InstanceImpl.getInternal(InstanceImpl.java:309)
	at io.quarkus.arc.impl.InstanceImpl.get(InstanceImpl.java:190)
	... 8 more
Caused by: java.lang.RuntimeException: Error injecting org.acme.MyRemoteService org.acme.GreetingResource.myRemoteService
	at org.acme.GreetingResource_Bean.doCreate(Unknown Source)
	at org.acme.GreetingResource_Bean.create(Unknown Source)
	at org.acme.GreetingResource_Bean.create(Unknown Source)
	at io.quarkus.arc.impl.AbstractSharedContext.createInstanceHandle(AbstractSharedContext.java:119)
	at io.quarkus.arc.impl.AbstractSharedContext$1.get(AbstractSharedContext.java:38)
	at io.quarkus.arc.impl.AbstractSharedContext$1.get(AbstractSharedContext.java:35)
	at io.quarkus.arc.impl.LazyValue.get(LazyValue.java:32)
	at io.quarkus.arc.impl.ComputingCache.computeIfAbsent(ComputingCache.java:69)
	at io.quarkus.arc.impl.ComputingCacheContextInstances.computeIfAbsent(ComputingCacheContextInstances.java:19)
	at io.quarkus.arc.impl.AbstractSharedContext.get(AbstractSharedContext.java:35)
	at org.acme.GreetingResource_Bean.get(Unknown Source)
	at org.acme.GreetingResource_Bean.get(Unknown Source)
	... 15 more
Caused by: java.lang.IllegalArgumentException: Unable to determine the proper baseUrl/baseUri. Consider registering using @RegisterRestClient(baseUri="someuri"), @RegisterRestClient(configKey="orkey"), or by adding 'quarkus.rest-client."org.acme.MyRemoteService".url' or 'quarkus.rest-client."org.acme.MyRemoteService".uri' to your Quarkus configuration
	at io.quarkus.rest.client.reactive.runtime.RestClientCDIDelegateBuilder.configureBaseUrl(RestClientCDIDelegateBuilder.java:402)
	at io.quarkus.rest.client.reactive.runtime.RestClientCDIDelegateBuilder.configureBuilder(RestClientCDIDelegateBuilder.java:78)
	at io.quarkus.rest.client.reactive.runtime.RestClientCDIDelegateBuilder.build(RestClientCDIDelegateBuilder.java:73)
	at io.quarkus.rest.client.reactive.runtime.RestClientCDIDelegateBuilder.createDelegate(RestClientCDIDelegateBuilder.java:54)
	at io.quarkus.rest.client.reactive.runtime.RestClientReactiveCDIWrapperBase.delegate(RestClientReactiveCDIWrapperBase.java:76)
	at io.quarkus.rest.client.reactive.runtime.RestClientReactiveCDIWrapperBase.<init>(RestClientReactiveCDIWrapperBase.java:30)
	at org.acme.MyRemoteService$$CDIWrapper.<init>(Unknown Source)
	at org.acme.MyRemoteService$$CDIWrapper_ClientProxy.<init>(Unknown Source)
	at org.acme.MyRemoteService$$CDIWrapper_Bean.proxy(Unknown Source)
	at org.acme.MyRemoteService$$CDIWrapper_Bean.get(Unknown Source)
	at org.acme.MyRemoteService$$CDIWrapper_Bean.get(Unknown Source)
	... 27 more


java.lang.NullPointerException: Cannot invoke "Object.hashCode()" because "key" is null

	at java.base/java.util.concurrent.ConcurrentHashMap.get(ConcurrentHashMap.java:937)
	at java.base/java.util.concurrent.ConcurrentHashMap.getOrDefault(ConcurrentHashMap.java:1599)
	at io.quarkus.test.junit.mockito.internal.MockitoMocksTracker.getMocks(MockitoMocksTracker.java:25)
	at io.quarkus.test.junit.mockito.internal.MockitoMocksTracker.clear(MockitoMocksTracker.java:35)
	at io.quarkus.test.junit.mockito.internal.ResetMockitoMocksAfterAllCallback.afterAll(ResetMockitoMocksAfterAllCallback.java:10)
	at java.base/java.lang.reflect.Method.invoke(Method.java:580)
	at io.quarkus.test.junit.AbstractTestWithCallbacksExtension.invokeCallbacks(AbstractTestWithCallbacksExtension.java:162)
	at io.quarkus.test.junit.AbstractTestWithCallbacksExtension.invokeAfterAllCallbacks(AbstractTestWithCallbacksExtension.java:100)
	at io.quarkus.test.junit.QuarkusTestExtension.runAfterAllCallbacks(QuarkusTestExtension.java:1055)
	at io.quarkus.test.junit.QuarkusTestExtension.afterAll(QuarkusTestExtension.java:1023)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1597)

How to Reproduce?

Reproducer:

rest-client-mock.zip

mvn quarkus:test

Output of uname -a or ver

MINGW64_NT-10.0-26100 NANBCHL9NG3 3.3.6-341.x86_64 2022-09-05 20:28 UTC x86_64 Msys

Output of java -version

openjdk 21.0.5 2024-10-15 LTS OpenJDK Runtime Environment Temurin-21.0.5+11 (build 21.0.5+11-LTS) OpenJDK 64-Bit Server VM Temurin-21.0.5+11 (build 21.0.5+11-LTS, mixed mode, sharing)

Quarkus version or git rev

3.21.2

Build tool (ie. output of mvnw --version or gradlew --version)

Apache Maven 3.8.8 (4c87b05d9aedce574290d1acc98575ed5eb6cd39) Maven home: C:\eclipse\tools\java\maven Java version: 21.0.5, vendor: Eclipse Adoptium, runtime: C:\eclipse\tools\java\21 Default locale: de_DE, platform encoding: UTF-8 OS name: "windows 11", version: "10.0", arch: "amd64", family: "windows"

Additional information

No response

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions