Skip to content

Commit 9af05b1

Browse files
authored
Merge pull request #47401 from geoand/#47383
Lift requirement of setting REST Client base URL when mocks are used
2 parents 080a206 + 80a1b71 commit 9af05b1

File tree

34 files changed

+93
-114
lines changed

34 files changed

+93
-114
lines changed

core/runtime/src/main/java/io/quarkus/runtime/MockedThroughWrapper.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22

33
/**
44
* Usually, QuarkusMock mocking replaces a "delegating instance" of a client proxy.
5-
*
6-
* In some cases, e.g. for REST Client Reactive, a CDI bean is a wrapper over a delegate.
5+
* <p>
6+
* In some cases, e.g. for REST Client, a CDI bean is a wrapper over a delegate.
77
* This interface allows to replace the delegate instead of the delegating instance of the proxy.
88
*/
99
public interface MockedThroughWrapper {

extensions/hibernate-validator/runtime/src/main/java/io/quarkus/hibernate/validator/runtime/ArcProxyBeanMetaDataClassNormalizer.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
* <br />
1111
* This can have more than one level of hierarchy, for example:
1212
* <ul>
13-
* <li>When using @{@link io.quarkus.test.junit.mockito.InjectMock} or @{@link io.quarkus.test.junit.mockito.InjectSpy}</li>
13+
* <li>When using {@code io.quarkus.test.InjectMock} or {@code io.quarkus.test.junit.mockito.InjectSpy}</li>
1414
* </ul>
1515
*/
1616
public class ArcProxyBeanMetaDataClassNormalizer implements BeanMetaDataClassNormalizer {

extensions/resteasy-reactive/rest-client/deployment/src/main/java/io/quarkus/rest/client/reactive/deployment/RestClientReactiveProcessor.java

+21-1
Original file line numberDiff line numberDiff line change
@@ -28,13 +28,15 @@
2828
import java.lang.reflect.Modifier;
2929
import java.util.ArrayList;
3030
import java.util.Collection;
31+
import java.util.Collections;
3132
import java.util.HashMap;
3233
import java.util.HashSet;
3334
import java.util.List;
3435
import java.util.Map;
3536
import java.util.Optional;
3637
import java.util.Set;
3738
import java.util.function.Predicate;
39+
import java.util.stream.Collectors;
3840

3941
import jakarta.enterprise.context.SessionScoped;
4042
import jakarta.enterprise.inject.Typed;
@@ -87,6 +89,7 @@
8789
import io.quarkus.deployment.builditem.ExtensionSslNativeSupportBuildItem;
8890
import io.quarkus.deployment.builditem.FeatureBuildItem;
8991
import io.quarkus.deployment.builditem.GeneratedClassBuildItem;
92+
import io.quarkus.deployment.builditem.LaunchModeBuildItem;
9093
import io.quarkus.deployment.builditem.RunTimeConfigBuilderBuildItem;
9194
import io.quarkus.deployment.builditem.ShutdownContextBuildItem;
9295
import io.quarkus.deployment.builditem.StaticInitConfigBuilderBuildItem;
@@ -119,7 +122,9 @@ class RestClientReactiveProcessor {
119122
private static final Logger log = Logger.getLogger(RestClientReactiveProcessor.class);
120123

121124
private static final DotName REGISTER_REST_CLIENT = DotName.createSimple(RegisterRestClient.class.getName());
125+
private static final DotName REST_CLIENT = DotName.createSimple(RestClient.class.getName());
122126
private static final DotName SESSION_SCOPED = DotName.createSimple(SessionScoped.class.getName());
127+
private static final DotName INJECT_MOCK = DotName.createSimple("io.quarkus.test.InjectMock");
123128
private static final DotName KOTLIN_METADATA_ANNOTATION = DotName.createSimple("kotlin.Metadata");
124129

125130
private static final String ENABLE_COMPRESSION = "quarkus.http.enable-compression";
@@ -473,11 +478,24 @@ void addRestClientBeans(Capabilities capabilities,
473478
BuildProducer<GeneratedBeanBuildItem> generatedBeans,
474479
RestClientReactiveConfig clientConfig,
475480
RestClientsBuildTimeConfig clientsBuildConfig,
481+
LaunchModeBuildItem launchMode,
476482
RestClientRecorder recorder,
477483
ShutdownContextBuildItem shutdown) {
478484

479485
CompositeIndex index = CompositeIndex.create(combinedIndexBuildItem.getIndex());
480486

487+
Set<DotName> requestedRestClientMocks = Collections.emptySet();
488+
if (launchMode.getLaunchMode() == LaunchMode.TEST) {
489+
// we need to determine which RestClient interfaces have been marked for mocking
490+
requestedRestClientMocks = combinedIndexBuildItem.getIndex().getAnnotations(INJECT_MOCK)
491+
.stream()
492+
.filter(ai -> ai.target().kind() == AnnotationTarget.Kind.FIELD)
493+
.map(ai -> ai.target().asField())
494+
.filter(f -> f.hasAnnotation(REST_CLIENT))
495+
.map(f -> f.type().name())
496+
.collect(Collectors.toSet());
497+
}
498+
481499
Map<String, String> configKeys = new HashMap<>();
482500
var annotationsStore = new AnnotationStore(index, restClientAnnotationsTransformerBuildItem.stream()
483501
.map(RestClientAnnotationsTransformerBuildItem::getAnnotationTransformation).toList());
@@ -552,14 +570,16 @@ void addRestClientBeans(Capabilities capabilities,
552570
Optional<String> baseUri = registerRestClient.getDefaultBaseUri();
553571

554572
ResultHandle baseUriHandle = constructor.load(baseUri.isPresent() ? baseUri.get() : "");
573+
boolean lazyDelegate = scope.getDotName().equals(REQUEST_SCOPED)
574+
|| requestedRestClientMocks.contains(jaxrsInterface.name());
555575
constructor.invokeSpecialMethod(
556576
MethodDescriptor.ofConstructor(RestClientReactiveCDIWrapperBase.class, Class.class, String.class,
557577
String.class, boolean.class),
558578
constructor.getThis(),
559579
constructor.loadClassFromTCCL(jaxrsInterface.toString()),
560580
baseUriHandle,
561581
configKey.isPresent() ? constructor.load(configKey.get()) : constructor.loadNull(),
562-
constructor.load(scope.getDotName().equals(REQUEST_SCOPED)));
582+
constructor.load(lazyDelegate));
563583
constructor.returnValue(null);
564584

565585
// METHODS:

extensions/resteasy-reactive/rest-client/runtime/src/main/java/io/quarkus/rest/client/reactive/runtime/RestClientReactiveCDIWrapperBase.java

+5-6
Original file line numberDiff line numberDiff line change
@@ -21,13 +21,12 @@ public abstract class RestClientReactiveCDIWrapperBase<T extends Closeable> impl
2121
private Object mock;
2222

2323
public RestClientReactiveCDIWrapperBase(Class<T> jaxrsInterface, String baseUriFromAnnotation,
24-
String configKey, boolean requestScope) {
24+
String configKey, boolean lazyDelegate) {
2525
this.jaxrsInterface = jaxrsInterface;
2626
this.baseUriFromAnnotation = baseUriFromAnnotation;
2727
this.configKey = configKey;
28-
if (!requestScope) {
29-
// when not using the Request scope, we eagerly create the delegate
30-
delegate();
28+
if (!lazyDelegate) {
29+
constructDelegate();
3130
}
3231
}
3332

@@ -55,7 +54,7 @@ public void destroy() {
5554
@SuppressWarnings("unused")
5655
@NoClassInterceptors
5756
public Object getDelegate() {
58-
return mock == null ? delegate() : mock;
57+
return mock == null ? constructDelegate() : mock;
5958
}
6059

6160
@Override
@@ -71,7 +70,7 @@ public void clearMock() {
7170
}
7271

7372
@NoClassInterceptors
74-
private T delegate() {
73+
private T constructDelegate() {
7574
if (delegate == null) {
7675
delegate = RestClientCDIDelegateBuilder.createDelegate(jaxrsInterface, baseUriFromAnnotation, configKey);
7776
}

integration-tests/grpc-plain-text-mutiny/src/test/java/io/quarkus/grpc/examples/hello/GrpcMockTest.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@
1111
import examples.HelloReply;
1212
import examples.HelloRequest;
1313
import io.quarkus.grpc.GrpcClient;
14+
import io.quarkus.test.InjectMock;
1415
import io.quarkus.test.junit.QuarkusTest;
15-
import io.quarkus.test.junit.mockito.InjectMock;
1616
import io.smallrye.mutiny.Uni;
1717

1818
@QuarkusTest

integration-tests/hibernate-orm-panache/src/test/java/io/quarkus/it/panache/defaultpu/PanacheMockingTest.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@
1717

1818
import io.quarkus.hibernate.orm.panache.PanacheRepositoryBase;
1919
import io.quarkus.panache.mock.PanacheMock;
20+
import io.quarkus.test.InjectMock;
2021
import io.quarkus.test.junit.QuarkusTest;
21-
import io.quarkus.test.junit.mockito.InjectMock;
2222

2323
@QuarkusTest
2424
public class PanacheMockingTest {

integration-tests/hibernate-reactive-panache/src/test/java/io/quarkus/it/panache/reactive/PanacheMockingTest.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@
1717
import io.quarkus.hibernate.reactive.panache.Panache;
1818
import io.quarkus.hibernate.reactive.panache.PanacheRepositoryBase;
1919
import io.quarkus.panache.mock.PanacheMock;
20+
import io.quarkus.test.InjectMock;
2021
import io.quarkus.test.junit.QuarkusTest;
21-
import io.quarkus.test.junit.mockito.InjectMock;
2222
import io.quarkus.test.vertx.RunOnVertxContext;
2323
import io.quarkus.test.vertx.UniAsserter;
2424
import io.smallrye.mutiny.Uni;

integration-tests/hibernate-validator/src/test/java/io/quarkus/hibernate/validator/runtime/ArcProxyBeanMetaDataClassNormalizerTest.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,8 @@ private static class FirstSubclass extends Original implements Subclass {
4848
}
4949

5050
/**
51-
* Simulates an object injected through @{@link io.quarkus.test.junit.mockito.InjectMock}
52-
* or @{@link io.quarkus.test.junit.mockito.InjectSpy}.
51+
* Simulates an object injected through {@link io.quarkus.test.InjectMock}
52+
* or {@code io.quarkus.test.junit.mockito.InjectSpy}.
5353
*/
5454
private static class SecondSubclass extends FirstSubclass {
5555
}

integration-tests/injectmock/src/test/java/io/quarkus/it/mockbean/DummyResourceTest.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@
99
import org.junit.jupiter.api.BeforeEach;
1010
import org.junit.jupiter.api.Test;
1111

12+
import io.quarkus.test.InjectMock;
1213
import io.quarkus.test.junit.QuarkusTest;
13-
import io.quarkus.test.junit.mockito.InjectMock;
1414

1515
@QuarkusTest
1616
class DummyResourceTest {

integration-tests/injectmock/src/test/java/io/quarkus/it/mockbean/FooResourceTest.java

+4-2
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,15 @@
99
import org.junit.jupiter.api.Test;
1010
import org.mockito.Mockito;
1111

12+
import io.quarkus.test.InjectMock;
1213
import io.quarkus.test.junit.QuarkusTest;
13-
import io.quarkus.test.junit.mockito.InjectMock;
14+
import io.quarkus.test.junit.mockito.MockitoConfig;
1415

1516
@QuarkusTest
1617
class FooResourceTest {
1718

18-
@InjectMock(returnsDeepMocks = true)
19+
@InjectMock
20+
@MockitoConfig(returnsDeepMocks = true)
1921
FooService fooService;
2022

2123
@Test

integration-tests/injectmock/src/test/java/io/quarkus/it/mockbean/GenericFieldsTest.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@
66
import org.junit.jupiter.api.Test;
77
import org.mockito.Mockito;
88

9+
import io.quarkus.test.InjectMock;
910
import io.quarkus.test.junit.QuarkusTest;
10-
import io.quarkus.test.junit.mockito.InjectMock;
1111

1212
@QuarkusTest
1313
public class GenericFieldsTest {

integration-tests/injectmock/src/test/java/io/quarkus/it/mockbean/GreetingResourceTest.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@
77
import org.junit.jupiter.api.Test;
88
import org.mockito.Mockito;
99

10+
import io.quarkus.test.InjectMock;
1011
import io.quarkus.test.junit.QuarkusTest;
11-
import io.quarkus.test.junit.mockito.InjectMock;
1212

1313
@QuarkusTest
1414
class GreetingResourceTest {

integration-tests/injectmock/src/test/java/io/quarkus/it/mockbean/GreetingSingletonResourceMockTest.java

+4-2
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,16 @@
55
import org.junit.jupiter.api.Test;
66
import org.mockito.Mockito;
77

8+
import io.quarkus.test.InjectMock;
89
import io.quarkus.test.junit.QuarkusTest;
9-
import io.quarkus.test.junit.mockito.InjectMock;
10+
import io.quarkus.test.junit.mockito.MockitoConfig;
1011

1112
@QuarkusTest
1213
class GreetingSingletonResourceMockTest {
1314

1415
// resteasy-reactive adds @Singleton automatically
15-
@InjectMock(convertScopes = true)
16+
@InjectMock
17+
@MockitoConfig(convertScopes = true)
1618
GreetingResourceSingleton greetingResourceSingleton;
1719

1820
@Test

integration-tests/injectmock/src/test/java/io/quarkus/it/mockbean/GreetingSingletonResourceTest.java

+6-4
Original file line numberDiff line numberDiff line change
@@ -10,21 +10,23 @@
1010
import org.mockito.invocation.InvocationOnMock;
1111
import org.mockito.stubbing.Answer;
1212

13+
import io.quarkus.test.InjectMock;
1314
import io.quarkus.test.junit.QuarkusTest;
14-
import io.quarkus.test.junit.mockito.InjectMock;
1515
import io.quarkus.test.junit.mockito.MockitoConfig;
1616

1717
@QuarkusTest
1818
class GreetingSingletonResourceTest {
1919

20-
@InjectMock(convertScopes = true)
20+
@InjectMock
21+
@MockitoConfig(convertScopes = true)
2122
MessageServiceSingleton messageService;
2223

23-
@io.quarkus.test.InjectMock
24+
@InjectMock
2425
@MockitoConfig(convertScopes = true)
2526
SuffixServiceSingleton suffixService;
2627

27-
@InjectMock(convertScopes = true)
28+
@InjectMock
29+
@MockitoConfig(convertScopes = true)
2830
CapitalizerServiceSingleton capitalizerService;
2931

3032
@Test

integration-tests/injectmock/src/test/java/io/quarkus/it/mockbean/MockedObserverTest.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@
1212
import org.junit.jupiter.api.Test;
1313
import org.mockito.Mockito;
1414

15+
import io.quarkus.test.InjectMock;
1516
import io.quarkus.test.junit.QuarkusTest;
16-
import io.quarkus.test.junit.mockito.InjectMock;
1717

1818
@QuarkusTest
1919
class MockedObserverTest {

integration-tests/injectmock/src/test/java/io/quarkus/it/mockbean/NestedTest.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@
77
import org.junit.jupiter.api.Test;
88
import org.mockito.Mockito;
99

10+
import io.quarkus.test.InjectMock;
1011
import io.quarkus.test.junit.QuarkusTest;
11-
import io.quarkus.test.junit.mockito.InjectMock;
1212

1313
@QuarkusTest
1414
public class NestedTest {

integration-tests/injectmock/src/test/java/io/quarkus/it/mockbean/SameBeanInstanceTest.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@
66

77
import org.junit.jupiter.api.Test;
88

9+
import io.quarkus.test.InjectMock;
910
import io.quarkus.test.junit.QuarkusTest;
10-
import io.quarkus.test.junit.mockito.InjectMock;
1111

1212
@QuarkusTest
1313
public class SameBeanInstanceTest {

integration-tests/injectmock/src/test/java/io/quarkus/it/mockbean/UnusedServiceTest.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@
44
import org.junit.jupiter.api.Test;
55

66
import io.quarkus.arc.Arc;
7+
import io.quarkus.test.InjectMock;
78
import io.quarkus.test.junit.QuarkusTest;
8-
import io.quarkus.test.junit.mockito.InjectMock;
99

1010
@QuarkusTest
1111
public class UnusedServiceTest {

integration-tests/mongodb-panache-kotlin/src/test/kotlin/io/quarkus/it/mongodb/panache/MongodbPanacheMockingTest.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@ import io.quarkus.it.mongodb.panache.person.Person
55
import io.quarkus.it.mongodb.panache.person.PersonEntity
66
import io.quarkus.it.mongodb.panache.person.PersonRepository
77
import io.quarkus.mongodb.panache.kotlin.PanacheMongoRepositoryBase
8+
import io.quarkus.test.InjectMock
89
import io.quarkus.test.junit.QuarkusTest
9-
import io.quarkus.test.junit.mockito.InjectMock
1010
import jakarta.inject.Inject
1111
import jakarta.ws.rs.WebApplicationException
1212
import java.util.Collections

integration-tests/mongodb-panache/src/test/java/io/quarkus/it/mongodb/panache/MongodbPanacheMockingTest.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@
1616
import io.quarkus.it.mongodb.panache.person.PersonRepository;
1717
import io.quarkus.mongodb.panache.PanacheMongoRepositoryBase;
1818
import io.quarkus.panache.mock.PanacheMock;
19+
import io.quarkus.test.InjectMock;
1920
import io.quarkus.test.junit.QuarkusTest;
20-
import io.quarkus.test.junit.mockito.InjectMock;
2121

2222
@QuarkusTest
2323
public class MongodbPanacheMockingTest {

integration-tests/mongodb-panache/src/test/java/io/quarkus/it/mongodb/panache/reactive/ReactiveMongodbPanacheMockingTest.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@
1414
import io.quarkus.it.mongodb.panache.reactive.person.MockableReactivePersonRepository;
1515
import io.quarkus.it.mongodb.panache.reactive.person.ReactivePersonEntity;
1616
import io.quarkus.panache.mock.PanacheMock;
17+
import io.quarkus.test.InjectMock;
1718
import io.quarkus.test.junit.QuarkusTest;
18-
import io.quarkus.test.junit.mockito.InjectMock;
1919
import io.smallrye.mutiny.Uni;
2020

2121
@QuarkusTest

integration-tests/rest-client-reactive/src/main/java/io/quarkus/it/rest/client/main/FaultToleranceOnInterfaceClient.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
import org.eclipse.microprofile.rest.client.inject.RegisterRestClient;
1313

1414
@Path("/unprocessable")
15-
@RegisterRestClient(configKey = "w-fault-tolerance")
15+
@RegisterRestClient(configKey = "w-fault-tolerance-int")
1616
@CircuitBreaker(requestVolumeThreshold = 2, delay = 1, delayUnit = ChronoUnit.MINUTES)
1717
public interface FaultToleranceOnInterfaceClient {
1818
@GET

integration-tests/rest-client-reactive/src/test/java/io/quarkus/it/rest/client/BasicTest.java

+10
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,14 @@
2424
import io.opentelemetry.api.trace.TraceId;
2525
import io.quarkus.test.common.http.TestHTTPResource;
2626
import io.quarkus.test.junit.QuarkusTest;
27+
import io.quarkus.test.junit.QuarkusTestProfile;
28+
import io.quarkus.test.junit.TestProfile;
2729
import io.restassured.RestAssured;
2830
import io.restassured.common.mapper.TypeRef;
2931
import io.restassured.response.Response;
3032

3133
@QuarkusTest
34+
@TestProfile(BasicTest.TestProfile.class)
3235
public class BasicTest {
3336

3437
@TestHTTPResource("/apples")
@@ -289,4 +292,11 @@ private List<Map<String, Object>> getClientSpansFromFullUrl(final String spanNam
289292
((String) stringObjectMap.get("attr_url.full")).startsWith(httpUrl))
290293
.collect(Collectors.toList());
291294
}
295+
296+
public static class TestProfile implements QuarkusTestProfile {
297+
@Override
298+
public Map<String, String> getConfigOverrides() {
299+
return Map.of("w-fault-tolerance-int/mp-rest/url", "${test.url}");
300+
}
301+
}
292302
}

integration-tests/rest-client-reactive/src/test/java/io/quarkus/it/rest/client/InjectMockTest.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@
1111

1212
import io.quarkus.it.rest.client.main.ClientWithExceptionMapper;
1313
import io.quarkus.it.rest.client.main.MyResponseExceptionMapper;
14+
import io.quarkus.test.InjectMock;
1415
import io.quarkus.test.junit.QuarkusTest;
15-
import io.quarkus.test.junit.mockito.InjectMock;
1616
import io.restassured.RestAssured;
1717

1818
@QuarkusTest

integration-tests/rest-client-reactive/src/test/java/io/quarkus/it/rest/client/InjectMockWithInterceptorTest.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@
1212
import org.junit.jupiter.api.Test;
1313

1414
import io.quarkus.it.rest.client.main.FaultToleranceOnInterfaceClient;
15+
import io.quarkus.test.InjectMock;
1516
import io.quarkus.test.junit.QuarkusTest;
16-
import io.quarkus.test.junit.mockito.InjectMock;
1717
import io.restassured.RestAssured;
1818
import io.smallrye.faulttolerance.api.CircuitBreakerMaintenance;
1919

0 commit comments

Comments
 (0)