Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@

/**
* Usually, QuarkusMock mocking replaces a "delegating instance" of a client proxy.
*
* In some cases, e.g. for REST Client Reactive, a CDI bean is a wrapper over a delegate.
* <p>
* In some cases, e.g. for REST Client, a CDI bean is a wrapper over a delegate.
* This interface allows to replace the delegate instead of the delegating instance of the proxy.
*/
public interface MockedThroughWrapper {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
* <br />
* This can have more than one level of hierarchy, for example:
* <ul>
* <li>When using @{@link io.quarkus.test.junit.mockito.InjectMock} or @{@link io.quarkus.test.junit.mockito.InjectSpy}</li>
* <li>When using {@code io.quarkus.test.InjectMock} or {@code io.quarkus.test.junit.mockito.InjectSpy}</li>
* </ul>
*/
public class ArcProxyBeanMetaDataClassNormalizer implements BeanMetaDataClassNormalizer {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,13 +28,15 @@
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
import java.util.function.Predicate;
import java.util.stream.Collectors;

import jakarta.enterprise.context.SessionScoped;
import jakarta.enterprise.inject.Typed;
Expand Down Expand Up @@ -87,6 +89,7 @@
import io.quarkus.deployment.builditem.ExtensionSslNativeSupportBuildItem;
import io.quarkus.deployment.builditem.FeatureBuildItem;
import io.quarkus.deployment.builditem.GeneratedClassBuildItem;
import io.quarkus.deployment.builditem.LaunchModeBuildItem;
import io.quarkus.deployment.builditem.RunTimeConfigBuilderBuildItem;
import io.quarkus.deployment.builditem.ShutdownContextBuildItem;
import io.quarkus.deployment.builditem.StaticInitConfigBuilderBuildItem;
Expand Down Expand Up @@ -119,7 +122,9 @@ class RestClientReactiveProcessor {
private static final Logger log = Logger.getLogger(RestClientReactiveProcessor.class);

private static final DotName REGISTER_REST_CLIENT = DotName.createSimple(RegisterRestClient.class.getName());
private static final DotName REST_CLIENT = DotName.createSimple(RestClient.class.getName());
private static final DotName SESSION_SCOPED = DotName.createSimple(SessionScoped.class.getName());
private static final DotName INJECT_MOCK = DotName.createSimple("io.quarkus.test.InjectMock");
private static final DotName KOTLIN_METADATA_ANNOTATION = DotName.createSimple("kotlin.Metadata");

private static final String ENABLE_COMPRESSION = "quarkus.http.enable-compression";
Expand Down Expand Up @@ -473,11 +478,24 @@ void addRestClientBeans(Capabilities capabilities,
BuildProducer<GeneratedBeanBuildItem> generatedBeans,
RestClientReactiveConfig clientConfig,
RestClientsBuildTimeConfig clientsBuildConfig,
LaunchModeBuildItem launchMode,
RestClientRecorder recorder,
ShutdownContextBuildItem shutdown) {

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

Set<DotName> requestedRestClientMocks = Collections.emptySet();
if (launchMode.getLaunchMode() == LaunchMode.TEST) {
// we need to determine which RestClient interfaces have been marked for mocking
requestedRestClientMocks = combinedIndexBuildItem.getIndex().getAnnotations(INJECT_MOCK)
.stream()
.filter(ai -> ai.target().kind() == AnnotationTarget.Kind.FIELD)
.map(ai -> ai.target().asField())
.filter(f -> f.hasAnnotation(REST_CLIENT))
.map(f -> f.type().name())
.collect(Collectors.toSet());
}

Map<String, String> configKeys = new HashMap<>();
var annotationsStore = new AnnotationStore(index, restClientAnnotationsTransformerBuildItem.stream()
.map(RestClientAnnotationsTransformerBuildItem::getAnnotationTransformation).toList());
Expand Down Expand Up @@ -552,14 +570,16 @@ void addRestClientBeans(Capabilities capabilities,
Optional<String> baseUri = registerRestClient.getDefaultBaseUri();

ResultHandle baseUriHandle = constructor.load(baseUri.isPresent() ? baseUri.get() : "");
boolean lazyDelegate = scope.getDotName().equals(REQUEST_SCOPED)
|| requestedRestClientMocks.contains(jaxrsInterface.name());
constructor.invokeSpecialMethod(
MethodDescriptor.ofConstructor(RestClientReactiveCDIWrapperBase.class, Class.class, String.class,
String.class, boolean.class),
constructor.getThis(),
constructor.loadClassFromTCCL(jaxrsInterface.toString()),
baseUriHandle,
configKey.isPresent() ? constructor.load(configKey.get()) : constructor.loadNull(),
constructor.load(scope.getDotName().equals(REQUEST_SCOPED)));
constructor.load(lazyDelegate));
constructor.returnValue(null);

// METHODS:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,13 +21,12 @@ public abstract class RestClientReactiveCDIWrapperBase<T extends Closeable> impl
private Object mock;

public RestClientReactiveCDIWrapperBase(Class<T> jaxrsInterface, String baseUriFromAnnotation,
String configKey, boolean requestScope) {
String configKey, boolean lazyDelegate) {
this.jaxrsInterface = jaxrsInterface;
this.baseUriFromAnnotation = baseUriFromAnnotation;
this.configKey = configKey;
if (!requestScope) {
// when not using the Request scope, we eagerly create the delegate
delegate();
if (!lazyDelegate) {
constructDelegate();
}
}

Expand Down Expand Up @@ -55,7 +54,7 @@ public void destroy() {
@SuppressWarnings("unused")
@NoClassInterceptors
public Object getDelegate() {
return mock == null ? delegate() : mock;
return mock == null ? constructDelegate() : mock;
}

@Override
Expand All @@ -71,7 +70,7 @@ public void clearMock() {
}

@NoClassInterceptors
private T delegate() {
private T constructDelegate() {
if (delegate == null) {
delegate = RestClientCDIDelegateBuilder.createDelegate(jaxrsInterface, baseUriFromAnnotation, configKey);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@
import examples.HelloReply;
import examples.HelloRequest;
import io.quarkus.grpc.GrpcClient;
import io.quarkus.test.InjectMock;
import io.quarkus.test.junit.QuarkusTest;
import io.quarkus.test.junit.mockito.InjectMock;
import io.smallrye.mutiny.Uni;

@QuarkusTest
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,8 @@

import io.quarkus.hibernate.orm.panache.PanacheRepositoryBase;
import io.quarkus.panache.mock.PanacheMock;
import io.quarkus.test.InjectMock;
import io.quarkus.test.junit.QuarkusTest;
import io.quarkus.test.junit.mockito.InjectMock;

@QuarkusTest
public class PanacheMockingTest {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,8 @@
import io.quarkus.hibernate.reactive.panache.Panache;
import io.quarkus.hibernate.reactive.panache.PanacheRepositoryBase;
import io.quarkus.panache.mock.PanacheMock;
import io.quarkus.test.InjectMock;
import io.quarkus.test.junit.QuarkusTest;
import io.quarkus.test.junit.mockito.InjectMock;
import io.quarkus.test.vertx.RunOnVertxContext;
import io.quarkus.test.vertx.UniAsserter;
import io.smallrye.mutiny.Uni;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,8 +48,8 @@ private static class FirstSubclass extends Original implements Subclass {
}

/**
* Simulates an object injected through @{@link io.quarkus.test.junit.mockito.InjectMock}
* or @{@link io.quarkus.test.junit.mockito.InjectSpy}.
* Simulates an object injected through {@link io.quarkus.test.InjectMock}
* or {@code io.quarkus.test.junit.mockito.InjectSpy}.
*/
private static class SecondSubclass extends FirstSubclass {
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

import io.quarkus.test.InjectMock;
import io.quarkus.test.junit.QuarkusTest;
import io.quarkus.test.junit.mockito.InjectMock;

@QuarkusTest
class DummyResourceTest {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,15 @@
import org.junit.jupiter.api.Test;
import org.mockito.Mockito;

import io.quarkus.test.InjectMock;
import io.quarkus.test.junit.QuarkusTest;
import io.quarkus.test.junit.mockito.InjectMock;
import io.quarkus.test.junit.mockito.MockitoConfig;

@QuarkusTest
class FooResourceTest {

@InjectMock(returnsDeepMocks = true)
@InjectMock
@MockitoConfig(returnsDeepMocks = true)
FooService fooService;

@Test
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@
import org.junit.jupiter.api.Test;
import org.mockito.Mockito;

import io.quarkus.test.InjectMock;
import io.quarkus.test.junit.QuarkusTest;
import io.quarkus.test.junit.mockito.InjectMock;

@QuarkusTest
public class GenericFieldsTest {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@
import org.junit.jupiter.api.Test;
import org.mockito.Mockito;

import io.quarkus.test.InjectMock;
import io.quarkus.test.junit.QuarkusTest;
import io.quarkus.test.junit.mockito.InjectMock;

@QuarkusTest
class GreetingResourceTest {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,16 @@
import org.junit.jupiter.api.Test;
import org.mockito.Mockito;

import io.quarkus.test.InjectMock;
import io.quarkus.test.junit.QuarkusTest;
import io.quarkus.test.junit.mockito.InjectMock;
import io.quarkus.test.junit.mockito.MockitoConfig;

@QuarkusTest
class GreetingSingletonResourceMockTest {

// resteasy-reactive adds @Singleton automatically
@InjectMock(convertScopes = true)
@InjectMock
@MockitoConfig(convertScopes = true)
GreetingResourceSingleton greetingResourceSingleton;

@Test
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,21 +10,23 @@
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;

import io.quarkus.test.InjectMock;
import io.quarkus.test.junit.QuarkusTest;
import io.quarkus.test.junit.mockito.InjectMock;
import io.quarkus.test.junit.mockito.MockitoConfig;

@QuarkusTest
class GreetingSingletonResourceTest {

@InjectMock(convertScopes = true)
@InjectMock
@MockitoConfig(convertScopes = true)
MessageServiceSingleton messageService;

@io.quarkus.test.InjectMock
@InjectMock
@MockitoConfig(convertScopes = true)
SuffixServiceSingleton suffixService;

@InjectMock(convertScopes = true)
@InjectMock
@MockitoConfig(convertScopes = true)
CapitalizerServiceSingleton capitalizerService;

@Test
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,8 @@
import org.junit.jupiter.api.Test;
import org.mockito.Mockito;

import io.quarkus.test.InjectMock;
import io.quarkus.test.junit.QuarkusTest;
import io.quarkus.test.junit.mockito.InjectMock;

@QuarkusTest
class MockedObserverTest {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@
import org.junit.jupiter.api.Test;
import org.mockito.Mockito;

import io.quarkus.test.InjectMock;
import io.quarkus.test.junit.QuarkusTest;
import io.quarkus.test.junit.mockito.InjectMock;

@QuarkusTest
public class NestedTest {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@

import org.junit.jupiter.api.Test;

import io.quarkus.test.InjectMock;
import io.quarkus.test.junit.QuarkusTest;
import io.quarkus.test.junit.mockito.InjectMock;

@QuarkusTest
public class SameBeanInstanceTest {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@
import org.junit.jupiter.api.Test;

import io.quarkus.arc.Arc;
import io.quarkus.test.InjectMock;
import io.quarkus.test.junit.QuarkusTest;
import io.quarkus.test.junit.mockito.InjectMock;

@QuarkusTest
public class UnusedServiceTest {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@ import io.quarkus.it.mongodb.panache.person.Person
import io.quarkus.it.mongodb.panache.person.PersonEntity
import io.quarkus.it.mongodb.panache.person.PersonRepository
import io.quarkus.mongodb.panache.kotlin.PanacheMongoRepositoryBase
import io.quarkus.test.InjectMock
import io.quarkus.test.junit.QuarkusTest
import io.quarkus.test.junit.mockito.InjectMock
import jakarta.inject.Inject
import jakarta.ws.rs.WebApplicationException
import java.util.Collections
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,8 @@
import io.quarkus.it.mongodb.panache.person.PersonRepository;
import io.quarkus.mongodb.panache.PanacheMongoRepositoryBase;
import io.quarkus.panache.mock.PanacheMock;
import io.quarkus.test.InjectMock;
import io.quarkus.test.junit.QuarkusTest;
import io.quarkus.test.junit.mockito.InjectMock;

@QuarkusTest
public class MongodbPanacheMockingTest {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@
import io.quarkus.it.mongodb.panache.reactive.person.MockableReactivePersonRepository;
import io.quarkus.it.mongodb.panache.reactive.person.ReactivePersonEntity;
import io.quarkus.panache.mock.PanacheMock;
import io.quarkus.test.InjectMock;
import io.quarkus.test.junit.QuarkusTest;
import io.quarkus.test.junit.mockito.InjectMock;
import io.smallrye.mutiny.Uni;

@QuarkusTest
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
import org.eclipse.microprofile.rest.client.inject.RegisterRestClient;

@Path("/unprocessable")
@RegisterRestClient(configKey = "w-fault-tolerance")
@RegisterRestClient(configKey = "w-fault-tolerance-int")
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This change was made in order to make the client have a config key that is not defined anywhere

@CircuitBreaker(requestVolumeThreshold = 2, delay = 1, delayUnit = ChronoUnit.MINUTES)
public interface FaultToleranceOnInterfaceClient {
@GET
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,11 +24,14 @@
import io.opentelemetry.api.trace.TraceId;
import io.quarkus.test.common.http.TestHTTPResource;
import io.quarkus.test.junit.QuarkusTest;
import io.quarkus.test.junit.QuarkusTestProfile;
import io.quarkus.test.junit.TestProfile;
import io.restassured.RestAssured;
import io.restassured.common.mapper.TypeRef;
import io.restassured.response.Response;

@QuarkusTest
@TestProfile(BasicTest.TestProfile.class)
public class BasicTest {

@TestHTTPResource("/apples")
Expand Down Expand Up @@ -289,4 +292,11 @@ private List<Map<String, Object>> getClientSpansFromFullUrl(final String spanNam
((String) stringObjectMap.get("attr_url.full")).startsWith(httpUrl))
.collect(Collectors.toList());
}

public static class TestProfile implements QuarkusTestProfile {
@Override
public Map<String, String> getConfigOverrides() {
return Map.of("w-fault-tolerance-int/mp-rest/url", "${test.url}");
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@

import io.quarkus.it.rest.client.main.ClientWithExceptionMapper;
import io.quarkus.it.rest.client.main.MyResponseExceptionMapper;
import io.quarkus.test.InjectMock;
import io.quarkus.test.junit.QuarkusTest;
import io.quarkus.test.junit.mockito.InjectMock;
import io.restassured.RestAssured;

@QuarkusTest
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,8 @@
import org.junit.jupiter.api.Test;

import io.quarkus.it.rest.client.main.FaultToleranceOnInterfaceClient;
import io.quarkus.test.InjectMock;
import io.quarkus.test.junit.QuarkusTest;
import io.quarkus.test.junit.mockito.InjectMock;
import io.restassured.RestAssured;
import io.smallrye.faulttolerance.api.CircuitBreakerMaintenance;

Expand Down
Loading
Loading