I have the below interface as the common Http action for GET, PUT, POST and DELETE
@Validated
@ExecuteOn(TaskExecutors.BLOCKING)
public interface IHttpAction<T, R> {
@Get(value = "/{?searchCriteria*}")
HttpResponse<?> find(@QueryValue T searchCriteria);
@Get(uri = "/{id}")
HttpResponse<?> get(@Nonnull UUID id);
HttpResponse<?> post(@Body T request);
@Put(uri = "/{id}")
HttpResponse<?> put(@NotNull UUID id, @Body T request);
HttpResponse<?> delete(@NotNull UUID id);
}
Now I have the micronuat declarative client as below
public class TestHttpClient {
@Client("/tag")
public interface TagHttpClient extends IHttpAction<TagRequest, TagResponse> { }
}
Now I am writing Test case as below
@MicronautTest
public class TagControllerTest {
private final TestHttpClient.TagHttpClient testHttpClient;
public TagControllerTest(TestHttpClient.TagHttpClient testHttpClient) {
this.testHttpClient = testHttpClient;
}
@Test
@DisplayName("Should create a tag with valid name")
void shouldCreateATagWithValidName() {
var result = this.testHttpClient.post(new TagRequest("schoolstaff"));
Assertions.assertNotNull(result);
}
}
The controller is implementing the same IHttpAction
with TagRequest
and TagResponse
@Controller("/tag")
@Version("1")
public class TagController implements IHttpAction<TagRequest, TagResponse> {
private final IServiceAction<TagRequest, TagResponse> iServiceAction;
public TagController(IServiceAction<TagRequest, TagResponse> iServiceAction) {
this.iServiceAction = iServiceAction;
}
@Override
public HttpResponse<?> post(TagRequest request) {
var result = this.iServiceAction.post(request);
return result.match(()-> HttpResponse.ok(result.value), ()->HttpResponse.notFound(result.exception.getMessage()));
}
// Other implementation
}
When I run the test case facing the below issue
All possible Introduction advise exhausted and no implementation found for method: HttpResponse post(TagRequest arg0)
io.micronaut.aop.exceptions.UnimplementedAdviceException: All possible Introduction advise exhausted and no implementation found for method: HttpResponse post(TagRequest arg0)
at io.micronaut.aop.chain.MethodInterceptorChain.proceed(MethodInterceptorChain.java:132)
at io.micronaut.http.client.interceptor.HttpClientIntroductionAdvice.intercept(HttpClientIntroductionAdvice.java:202)
at io.micronaut.aop.chain.MethodInterceptorChain.proceed(MethodInterceptorChain.java:143)
at io.micronaut.validation.ValidatingInterceptor.validateReturnMicronautValidator(ValidatingInterceptor.java:153)
at io.micronaut.validation.ValidatingInterceptor.intercept(ValidatingInterceptor.java:139)
at io.micronaut.aop.chain.MethodInterceptorChain.proceed(MethodInterceptorChain.java:143)
at schoolstaff.TestHttpClient$TagHttpClient$Intercepted.post(Unknown Source)
at schoolstaff.integration.TagControllerTest.shouldCreateATagWithValidName(TagControllerTest.java:27)
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
at io.micronaut.test.extensions.junit5.MicronautJunit5Extension$2.proceed(MicronautJunit5Extension.java:142)
at io.micronaut.test.extensions.AbstractMicronautExtension.interceptEach(AbstractMicronautExtension.java:162)
at io.micronaut.test.extensions.AbstractMicronautExtension.interceptTest(AbstractMicronautExtension.java:119)
at io.micronaut.test.extensions.junit5.MicronautJunit5Extension.interceptTestMethod(MicronautJunit5Extension.java:129)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)