Add RAG client
This commit is contained in:
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,4 @@
|
||||
-------------------------------------------------------------------------------
|
||||
Test set: com.example.mapper.conversation.DialogflowRequestMapperTest
|
||||
-------------------------------------------------------------------------------
|
||||
Tests run: 6, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.210 s -- in com.example.mapper.conversation.DialogflowRequestMapperTest
|
||||
@@ -0,0 +1,4 @@
|
||||
-------------------------------------------------------------------------------
|
||||
Test set: com.example.mapper.conversation.DialogflowResponseMapperTest
|
||||
-------------------------------------------------------------------------------
|
||||
Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.095 s -- in com.example.mapper.conversation.DialogflowResponseMapperTest
|
||||
@@ -0,0 +1,4 @@
|
||||
-------------------------------------------------------------------------------
|
||||
Test set: com.example.mapper.messagefilter.ConversationContextMapperTest
|
||||
-------------------------------------------------------------------------------
|
||||
Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.200 s -- in com.example.mapper.messagefilter.ConversationContextMapperTest
|
||||
@@ -0,0 +1,4 @@
|
||||
-------------------------------------------------------------------------------
|
||||
Test set: com.example.mapper.rag.RagRequestMapperTest
|
||||
-------------------------------------------------------------------------------
|
||||
Tests run: 11, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.044 s -- in com.example.mapper.rag.RagRequestMapperTest
|
||||
@@ -0,0 +1,4 @@
|
||||
-------------------------------------------------------------------------------
|
||||
Test set: com.example.mapper.rag.RagResponseMapperTest
|
||||
-------------------------------------------------------------------------------
|
||||
Tests run: 10, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1.983 s -- in com.example.mapper.rag.RagResponseMapperTest
|
||||
@@ -0,0 +1,89 @@
|
||||
-------------------------------------------------------------------------------
|
||||
Test set: com.example.service.GeminiClientServiceTest
|
||||
-------------------------------------------------------------------------------
|
||||
Tests run: 5, Failures: 0, Errors: 5, Skipped: 0, Time elapsed: 0.988 s <<< FAILURE! -- in com.example.service.GeminiClientServiceTest
|
||||
com.example.service.GeminiClientServiceTest.generateContent_whenUnexpectedExceptionOccurs_throwsGeminiClientException -- Time elapsed: 0.201 s <<< ERROR!
|
||||
java.lang.NullPointerException: Cannot invoke "com.google.genai.Models.generateContent(String, com.google.genai.types.Content, com.google.genai.types.GenerateContentConfig)" because "this.geminiClient.models" is null
|
||||
at com.example.service.GeminiClientServiceTest.generateContent_whenUnexpectedExceptionOccurs_throwsGeminiClientException(GeminiClientServiceTest .java:112)
|
||||
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
|
||||
at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
|
||||
at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
|
||||
|
||||
com.example.service.GeminiClientServiceTest.generateContent_whenGenAiIOExceptionOccurs_throwsGeminiClientException -- Time elapsed: 0.024 s <<< ERROR!
|
||||
org.mockito.exceptions.misusing.InvalidUseOfMatchersException:
|
||||
|
||||
Misplaced or misused argument matcher detected here:
|
||||
|
||||
-> at com.example.service.GeminiClientServiceTest.generateContent_whenUnexpectedExceptionOccurs_throwsGeminiClientException(GeminiClientServiceTest .java:112)
|
||||
-> at com.example.service.GeminiClientServiceTest.generateContent_whenUnexpectedExceptionOccurs_throwsGeminiClientException(GeminiClientServiceTest .java:112)
|
||||
-> at com.example.service.GeminiClientServiceTest.generateContent_whenUnexpectedExceptionOccurs_throwsGeminiClientException(GeminiClientServiceTest .java:112)
|
||||
|
||||
You cannot use argument matchers outside of verification or stubbing.
|
||||
Examples of correct usage of argument matchers:
|
||||
when(mock.get(anyInt())).thenReturn(null);
|
||||
doThrow(new RuntimeException()).when(mock).someVoidMethod(any());
|
||||
verify(mock).someMethod(contains("foo"))
|
||||
|
||||
This message may appear after an NullPointerException if the last matcher is returning an object
|
||||
like any() but the stubbed method signature expect a primitive argument, in this case,
|
||||
use primitive alternatives.
|
||||
when(mock.get(any())); // bad use, will raise NPE
|
||||
when(mock.get(anyInt())); // correct usage use
|
||||
|
||||
Also, this error might show up because you use argument matchers with methods that cannot be mocked.
|
||||
Following methods *cannot* be stubbed/verified: final/private/equals()/hashCode().
|
||||
Mocking methods declared on non-public parent classes is not supported.
|
||||
|
||||
at org.mockito.junit.jupiter.MockitoExtension.beforeEach(MockitoExtension.java:160)
|
||||
at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
|
||||
at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
|
||||
Suppressed: java.lang.NullPointerException: Cannot invoke "java.util.Set.forEach(java.util.function.Consumer)" because the return value of "org.junit.jupiter.api.extension.ExtensionContext$Store.remove(Object, java.lang.Class)" is null
|
||||
at org.mockito.junit.jupiter.MockitoExtension.afterEach(MockitoExtension.java:194)
|
||||
... 2 more
|
||||
|
||||
com.example.service.GeminiClientServiceTest.generateContent_whenResponseTextIsNull_throwsGeminiClientException -- Time elapsed: 0.710 s <<< ERROR!
|
||||
java.lang.NullPointerException: Cannot invoke "com.google.genai.Models.generateContent(String, com.google.genai.types.Content, com.google.genai.types.GenerateContentConfig)" because "this.geminiClient.models" is null
|
||||
at com.example.service.GeminiClientServiceTest.generateContent_whenResponseTextIsNull_throwsGeminiClientException(GeminiClientServiceTest .java:85)
|
||||
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
|
||||
at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
|
||||
at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
|
||||
|
||||
com.example.service.GeminiClientServiceTest.generateContent_whenApiSucceeds_returnsGeneratedText -- Time elapsed: 0.005 s <<< ERROR!
|
||||
org.mockito.exceptions.misusing.InvalidUseOfMatchersException:
|
||||
|
||||
Misplaced or misused argument matcher detected here:
|
||||
|
||||
-> at com.example.service.GeminiClientServiceTest.generateContent_whenResponseTextIsNull_throwsGeminiClientException(GeminiClientServiceTest .java:85)
|
||||
-> at com.example.service.GeminiClientServiceTest.generateContent_whenResponseTextIsNull_throwsGeminiClientException(GeminiClientServiceTest .java:85)
|
||||
-> at com.example.service.GeminiClientServiceTest.generateContent_whenResponseTextIsNull_throwsGeminiClientException(GeminiClientServiceTest .java:85)
|
||||
|
||||
You cannot use argument matchers outside of verification or stubbing.
|
||||
Examples of correct usage of argument matchers:
|
||||
when(mock.get(anyInt())).thenReturn(null);
|
||||
doThrow(new RuntimeException()).when(mock).someVoidMethod(any());
|
||||
verify(mock).someMethod(contains("foo"))
|
||||
|
||||
This message may appear after an NullPointerException if the last matcher is returning an object
|
||||
like any() but the stubbed method signature expect a primitive argument, in this case,
|
||||
use primitive alternatives.
|
||||
when(mock.get(any())); // bad use, will raise NPE
|
||||
when(mock.get(anyInt())); // correct usage use
|
||||
|
||||
Also, this error might show up because you use argument matchers with methods that cannot be mocked.
|
||||
Following methods *cannot* be stubbed/verified: final/private/equals()/hashCode().
|
||||
Mocking methods declared on non-public parent classes is not supported.
|
||||
|
||||
at org.mockito.junit.jupiter.MockitoExtension.beforeEach(MockitoExtension.java:160)
|
||||
at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
|
||||
at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
|
||||
Suppressed: java.lang.NullPointerException: Cannot invoke "java.util.Set.forEach(java.util.function.Consumer)" because the return value of "org.junit.jupiter.api.extension.ExtensionContext$Store.remove(Object, java.lang.Class)" is null
|
||||
at org.mockito.junit.jupiter.MockitoExtension.afterEach(MockitoExtension.java:194)
|
||||
... 2 more
|
||||
|
||||
com.example.service.GeminiClientServiceTest.generateContent_whenApiResponseIsNull_throwsGeminiClientException -- Time elapsed: 0.017 s <<< ERROR!
|
||||
java.lang.NullPointerException: Cannot invoke "com.google.genai.Models.generateContent(String, com.google.genai.types.Content, com.google.genai.types.GenerateContentConfig)" because "this.geminiClient.models" is null
|
||||
at com.example.service.GeminiClientServiceTest.generateContent_whenApiResponseIsNull_throwsGeminiClientException(GeminiClientServiceTest .java:71)
|
||||
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
|
||||
at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
|
||||
at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
|
||||
|
||||
@@ -0,0 +1,97 @@
|
||||
-------------------------------------------------------------------------------
|
||||
Test set: com.example.service.conversation.ConversationManagerServiceTest
|
||||
-------------------------------------------------------------------------------
|
||||
Tests run: 1, Failures: 1, Errors: 0, Skipped: 0, Time elapsed: 0.397 s <<< FAILURE! -- in com.example.service.conversation.ConversationManagerServiceTest
|
||||
com.example.service.conversation.ConversationManagerServiceTest.startNotificationConversation_shouldSaveResolvedContextAndReturnIt -- Time elapsed: 0.392 s <<< FAILURE!
|
||||
java.lang.AssertionError: expectation "expectNextMatches" failed (expected: onNext(); actual: onError(java.lang.NullPointerException: Cannot invoke "com.example.dto.dialogflow.conversation.QueryInputDTO.languageCode()" because the return value of "com.example.dto.dialogflow.base.DetectIntentRequestDTO.queryInput()" is null))
|
||||
at reactor.test.MessageFormatter.assertionError(MessageFormatter.java:115)
|
||||
at reactor.test.MessageFormatter.failPrefix(MessageFormatter.java:104)
|
||||
at reactor.test.MessageFormatter.fail(MessageFormatter.java:73)
|
||||
at reactor.test.MessageFormatter.failOptional(MessageFormatter.java:88)
|
||||
at reactor.test.DefaultStepVerifierBuilder.lambda$expectNextMatches$11(DefaultStepVerifierBuilder.java:556)
|
||||
at reactor.test.DefaultStepVerifierBuilder$SignalEvent.test(DefaultStepVerifierBuilder.java:2289)
|
||||
at reactor.test.DefaultStepVerifierBuilder$DefaultVerifySubscriber.onSignal(DefaultStepVerifierBuilder.java:1529)
|
||||
at reactor.test.DefaultStepVerifierBuilder$DefaultVerifySubscriber.onExpectation(DefaultStepVerifierBuilder.java:1477)
|
||||
at reactor.test.DefaultStepVerifierBuilder$DefaultVerifySubscriber.onError(DefaultStepVerifierBuilder.java:1129)
|
||||
at reactor.core.publisher.MonoFlatMap$FlatMapMain.secondError(MonoFlatMap.java:241)
|
||||
at reactor.core.publisher.MonoFlatMap$FlatMapInner.onError(MonoFlatMap.java:315)
|
||||
at reactor.core.publisher.MonoFlatMap$FlatMapMain.secondError(MonoFlatMap.java:241)
|
||||
at reactor.core.publisher.MonoFlatMap$FlatMapInner.onError(MonoFlatMap.java:315)
|
||||
at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.onError(MonoIgnoreThen.java:280)
|
||||
at reactor.core.publisher.Operators.error(Operators.java:198)
|
||||
at reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:49)
|
||||
at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.subscribeNext(MonoIgnoreThen.java:241)
|
||||
at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.onComplete(MonoIgnoreThen.java:204)
|
||||
at reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.onComplete(MonoPeekTerminal.java:299)
|
||||
at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.onComplete(MonoIgnoreThen.java:210)
|
||||
at reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.onComplete(MonoPeekTerminal.java:299)
|
||||
at reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.onComplete(MonoPeekTerminal.java:299)
|
||||
at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.onComplete(MonoIgnoreThen.java:210)
|
||||
at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.subscribeNext(MonoIgnoreThen.java:239)
|
||||
at reactor.core.publisher.MonoIgnoreThen.subscribe(MonoIgnoreThen.java:51)
|
||||
at reactor.core.publisher.InternalMonoOperator.subscribe(InternalMonoOperator.java:76)
|
||||
at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.subscribeNext(MonoIgnoreThen.java:241)
|
||||
at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.onComplete(MonoIgnoreThen.java:204)
|
||||
at reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.onComplete(MonoPeekTerminal.java:299)
|
||||
at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.onComplete(MonoIgnoreThen.java:210)
|
||||
at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.subscribeNext(MonoIgnoreThen.java:239)
|
||||
at reactor.core.publisher.MonoIgnoreThen.subscribe(MonoIgnoreThen.java:51)
|
||||
at reactor.core.publisher.Mono.subscribe(Mono.java:4576)
|
||||
at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.subscribeNext(MonoIgnoreThen.java:265)
|
||||
at reactor.core.publisher.MonoIgnoreThen.subscribe(MonoIgnoreThen.java:51)
|
||||
at reactor.core.publisher.Mono.subscribe(Mono.java:4576)
|
||||
at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.subscribeNext(MonoIgnoreThen.java:265)
|
||||
at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.onComplete(MonoIgnoreThen.java:204)
|
||||
at reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.onComplete(MonoPeekTerminal.java:299)
|
||||
at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.onComplete(MonoIgnoreThen.java:210)
|
||||
at reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.onComplete(MonoPeekTerminal.java:299)
|
||||
at reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.onComplete(MonoPeekTerminal.java:299)
|
||||
at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.onComplete(MonoIgnoreThen.java:210)
|
||||
at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.subscribeNext(MonoIgnoreThen.java:239)
|
||||
at reactor.core.publisher.MonoIgnoreThen.subscribe(MonoIgnoreThen.java:51)
|
||||
at reactor.core.publisher.InternalMonoOperator.subscribe(InternalMonoOperator.java:76)
|
||||
at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.subscribeNext(MonoIgnoreThen.java:241)
|
||||
at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.onComplete(MonoIgnoreThen.java:204)
|
||||
at reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.onComplete(MonoPeekTerminal.java:299)
|
||||
at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.onComplete(MonoIgnoreThen.java:210)
|
||||
at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.subscribeNext(MonoIgnoreThen.java:239)
|
||||
at reactor.core.publisher.MonoIgnoreThen.subscribe(MonoIgnoreThen.java:51)
|
||||
at reactor.core.publisher.Mono.subscribe(Mono.java:4576)
|
||||
at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.subscribeNext(MonoIgnoreThen.java:265)
|
||||
at reactor.core.publisher.MonoIgnoreThen.subscribe(MonoIgnoreThen.java:51)
|
||||
at reactor.core.publisher.Mono.subscribe(Mono.java:4576)
|
||||
at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.subscribeNext(MonoIgnoreThen.java:265)
|
||||
at reactor.core.publisher.MonoIgnoreThen.subscribe(MonoIgnoreThen.java:51)
|
||||
at reactor.core.publisher.MonoFlatMap$FlatMapMain.onNext(MonoFlatMap.java:165)
|
||||
at reactor.core.publisher.FluxDefaultIfEmpty$DefaultIfEmptySubscriber.onNext(FluxDefaultIfEmpty.java:122)
|
||||
at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.onNext(FluxMapFuseable.java:129)
|
||||
at reactor.core.publisher.MonoCallable$MonoCallableSubscription.request(MonoCallable.java:156)
|
||||
at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.request(FluxMapFuseable.java:171)
|
||||
at reactor.core.publisher.FluxDefaultIfEmpty$DefaultIfEmptySubscriber.request(FluxDefaultIfEmpty.java:98)
|
||||
at reactor.core.publisher.MonoFlatMap$FlatMapMain.request(MonoFlatMap.java:194)
|
||||
at reactor.core.publisher.MonoFlatMap$FlatMapInner.onSubscribe(MonoFlatMap.java:291)
|
||||
at reactor.core.publisher.MonoFlatMap$FlatMapMain.onSubscribe(MonoFlatMap.java:117)
|
||||
at reactor.core.publisher.Operators$BaseFluxToMonoOperator.onSubscribe(Operators.java:2050)
|
||||
at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.onSubscribe(FluxMapFuseable.java:96)
|
||||
at reactor.core.publisher.MonoCallable.subscribe(MonoCallable.java:48)
|
||||
at reactor.core.publisher.InternalMonoOperator.subscribe(InternalMonoOperator.java:76)
|
||||
at reactor.core.publisher.MonoFlatMap$FlatMapMain.onNext(MonoFlatMap.java:165)
|
||||
at reactor.core.publisher.FluxSwitchIfEmpty$SwitchIfEmptySubscriber.onNext(FluxSwitchIfEmpty.java:74)
|
||||
at reactor.core.publisher.Operators$ScalarSubscription.request(Operators.java:2570)
|
||||
at reactor.core.publisher.Operators$MultiSubscriptionSubscriber.set(Operators.java:2366)
|
||||
at reactor.core.publisher.Operators$MultiSubscriptionSubscriber.onSubscribe(Operators.java:2240)
|
||||
at reactor.core.publisher.MonoJust.subscribe(MonoJust.java:55)
|
||||
at reactor.core.publisher.Mono.subscribe(Mono.java:4576)
|
||||
at reactor.test.DefaultStepVerifierBuilder$DefaultStepVerifier.toVerifierAndSubscribe(DefaultStepVerifierBuilder.java:891)
|
||||
at reactor.test.DefaultStepVerifierBuilder$DefaultStepVerifier.verify(DefaultStepVerifierBuilder.java:831)
|
||||
at reactor.test.DefaultStepVerifierBuilder$DefaultStepVerifier.verify(DefaultStepVerifierBuilder.java:823)
|
||||
at reactor.test.DefaultStepVerifierBuilder.verifyComplete(DefaultStepVerifierBuilder.java:690)
|
||||
at com.example.service.conversation.ConversationManagerServiceTest.startNotificationConversation_shouldSaveResolvedContextAndReturnIt(ConversationManagerServiceTest.java:105)
|
||||
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
|
||||
at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
|
||||
at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
|
||||
Suppressed: java.lang.NullPointerException: Cannot invoke "com.example.dto.dialogflow.conversation.QueryInputDTO.languageCode()" because the return value of "com.example.dto.dialogflow.base.DetectIntentRequestDTO.queryInput()" is null
|
||||
at com.example.service.conversation.ConversationManagerService.lambda$32(ConversationManagerService.java:364)
|
||||
at reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:45)
|
||||
... 70 more
|
||||
|
||||
@@ -0,0 +1,169 @@
|
||||
-------------------------------------------------------------------------------
|
||||
Test set: com.example.service.integration_testing.MessageEntryFilterIntegrationTest
|
||||
-------------------------------------------------------------------------------
|
||||
Tests run: 3, Failures: 0, Errors: 3, Skipped: 0, Time elapsed: 2.766 s <<< FAILURE! -- in com.example.service.integration_testing.MessageEntryFilterIntegrationTest
|
||||
com.example.service.integration_testing.MessageEntryFilterIntegrationTest.classifyMessage_integrationTest_shouldClassifyVariousQueriesAsNotificationWithContext -- Time elapsed: 0.008 s <<< ERROR!
|
||||
java.lang.IllegalStateException: Failed to load ApplicationContext for [ReactiveWebMergedContextConfiguration@57cfb4d8 testClass = com.example.service.integration_testing.MessageEntryFilterIntegrationTest, locations = [], classes = [com.example.Orchestrator], contextInitializerClasses = [], activeProfiles = ["dev"], propertySourceDescriptors = [], propertySourceProperties = ["org.springframework.boot.test.context.SpringBootTestContextBootstrapper=true"], contextCustomizers = [org.springframework.boot.test.context.filter.ExcludeFilterContextCustomizer@7831d1aa, org.springframework.boot.test.json.DuplicateJsonObjectContextCustomizerFactory$DuplicateJsonObjectContextCustomizer@56da8847, org.springframework.boot.test.mock.mockito.MockitoContextCustomizer@0, org.springframework.boot.test.web.client.TestRestTemplateContextCustomizer@5da3f32a, org.springframework.boot.test.web.reactive.server.WebTestClientContextCustomizer@1b36d248, org.springframework.boot.test.web.reactor.netty.DisableReactorResourceFactoryGlobalResourcesContextCustomizerFactory$DisableReactorResourceFactoryGlobalResourcesContextCustomizerCustomizer@66dd04e2, org.springframework.boot.test.autoconfigure.OnFailureConditionReportContextCustomizerFactory$OnFailureConditionReportContextCustomizer@6eded11a, org.springframework.boot.test.autoconfigure.actuate.observability.ObservabilityContextCustomizerFactory$DisableObservabilityContextCustomizer@1f, org.springframework.boot.test.autoconfigure.properties.PropertyMappingContextCustomizer@0, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverContextCustomizer@77a85e76, org.springframework.boot.test.context.SpringBootTestAnnotation@712786df], contextLoader = org.springframework.boot.test.context.SpringBootContextLoader, parent = null]
|
||||
at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:180)
|
||||
at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:130)
|
||||
at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:142)
|
||||
at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.prepareTestInstance(DependencyInjectionTestExecutionListener.java:98)
|
||||
at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:260)
|
||||
at org.springframework.test.context.junit.jupiter.SpringExtension.postProcessTestInstance(SpringExtension.java:163)
|
||||
at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
|
||||
at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:179)
|
||||
at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1708)
|
||||
at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
|
||||
at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
|
||||
at java.base/java.util.stream.StreamSpliterators$WrappingSpliterator.forEachRemaining(StreamSpliterators.java:310)
|
||||
at java.base/java.util.stream.Streams$ConcatSpliterator.forEachRemaining(Streams.java:735)
|
||||
at java.base/java.util.stream.Streams$ConcatSpliterator.forEachRemaining(Streams.java:734)
|
||||
at java.base/java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:762)
|
||||
at java.base/java.util.Optional.orElseGet(Optional.java:364)
|
||||
at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
|
||||
at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
|
||||
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'conversationController' defined in file [/home/coder/capa-de-integracion/target/classes/com/example/controller/ConversationController.class]: Unsatisfied dependency expressed through constructor parameter 0: Error creating bean with name 'conversationManagerService' defined in file [/home/coder/capa-de-integracion/target/classes/com/example/service/conversation/ConversationManagerService.class]: Unsatisfied dependency expressed through constructor parameter 0: Error creating bean with name 'intentDetectionService' defined in class path resource [com/example/config/IntentDetectionConfig.class]: Unsatisfied dependency expressed through method 'intentDetectionService' parameter 0: Error creating bean with name 'dialogflowClientService' defined in file [/home/coder/capa-de-integracion/target/classes/com/example/service/base/DialogflowClientService.class]: Unexpected exception during bean creation
|
||||
at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:795)
|
||||
at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:237)
|
||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1375)
|
||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1212)
|
||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:562)
|
||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:522)
|
||||
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:337)
|
||||
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
|
||||
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:335)
|
||||
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:200)
|
||||
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:975)
|
||||
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:971)
|
||||
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:625)
|
||||
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:755)
|
||||
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:456)
|
||||
at org.springframework.boot.SpringApplication.run(SpringApplication.java:335)
|
||||
at org.springframework.boot.test.context.SpringBootContextLoader.lambda$loadContext$3(SpringBootContextLoader.java:145)
|
||||
at org.springframework.util.function.ThrowingSupplier.get(ThrowingSupplier.java:58)
|
||||
at org.springframework.util.function.ThrowingSupplier.get(ThrowingSupplier.java:46)
|
||||
at org.springframework.boot.SpringApplication.withHook(SpringApplication.java:1464)
|
||||
at org.springframework.boot.test.context.SpringBootContextLoader$ContextLoaderHook.run(SpringBootContextLoader.java:564)
|
||||
at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:145)
|
||||
at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:116)
|
||||
at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:225)
|
||||
at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:152)
|
||||
... 17 more
|
||||
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'conversationManagerService' defined in file [/home/coder/capa-de-integracion/target/classes/com/example/service/conversation/ConversationManagerService.class]: Unsatisfied dependency expressed through constructor parameter 0: Error creating bean with name 'intentDetectionService' defined in class path resource [com/example/config/IntentDetectionConfig.class]: Unsatisfied dependency expressed through method 'intentDetectionService' parameter 0: Error creating bean with name 'dialogflowClientService' defined in file [/home/coder/capa-de-integracion/target/classes/com/example/service/base/DialogflowClientService.class]: Unexpected exception during bean creation
|
||||
at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:795)
|
||||
at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:237)
|
||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1375)
|
||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1212)
|
||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:562)
|
||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:522)
|
||||
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:337)
|
||||
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
|
||||
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:335)
|
||||
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:200)
|
||||
at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:254)
|
||||
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1448)
|
||||
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1358)
|
||||
at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:904)
|
||||
at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:782)
|
||||
... 41 more
|
||||
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'intentDetectionService' defined in class path resource [com/example/config/IntentDetectionConfig.class]: Unsatisfied dependency expressed through method 'intentDetectionService' parameter 0: Error creating bean with name 'dialogflowClientService' defined in file [/home/coder/capa-de-integracion/target/classes/com/example/service/base/DialogflowClientService.class]: Unexpected exception during bean creation
|
||||
at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:795)
|
||||
at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:542)
|
||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1355)
|
||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1185)
|
||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:562)
|
||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:522)
|
||||
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:337)
|
||||
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
|
||||
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:335)
|
||||
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:200)
|
||||
at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:254)
|
||||
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1448)
|
||||
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1358)
|
||||
at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:904)
|
||||
at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:782)
|
||||
... 55 more
|
||||
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dialogflowClientService' defined in file [/home/coder/capa-de-integracion/target/classes/com/example/service/base/DialogflowClientService.class]: Unexpected exception during bean creation
|
||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:535)
|
||||
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:337)
|
||||
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
|
||||
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:335)
|
||||
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:200)
|
||||
at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:254)
|
||||
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1448)
|
||||
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1358)
|
||||
at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:904)
|
||||
at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:782)
|
||||
... 69 more
|
||||
Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'DIALOGFLOW_CX_PROJECT_ID' in value "${DIALOGFLOW_CX_PROJECT_ID}"
|
||||
at org.springframework.util.PropertyPlaceholderHelper.parseStringValue(PropertyPlaceholderHelper.java:180)
|
||||
at org.springframework.util.PropertyPlaceholderHelper.replacePlaceholders(PropertyPlaceholderHelper.java:126)
|
||||
at org.springframework.core.env.AbstractPropertyResolver.doResolvePlaceholders(AbstractPropertyResolver.java:239)
|
||||
at org.springframework.core.env.AbstractPropertyResolver.resolveRequiredPlaceholders(AbstractPropertyResolver.java:210)
|
||||
at org.springframework.core.env.AbstractPropertyResolver.resolveNestedPlaceholders(AbstractPropertyResolver.java:230)
|
||||
at org.springframework.boot.context.properties.source.ConfigurationPropertySourcesPropertyResolver.getProperty(ConfigurationPropertySourcesPropertyResolver.java:81)
|
||||
at org.springframework.boot.context.properties.source.ConfigurationPropertySourcesPropertyResolver.getProperty(ConfigurationPropertySourcesPropertyResolver.java:62)
|
||||
at org.springframework.core.env.AbstractEnvironment.getProperty(AbstractEnvironment.java:552)
|
||||
at org.springframework.context.support.PropertySourcesPlaceholderConfigurer$1.getProperty(PropertySourcesPlaceholderConfigurer.java:153)
|
||||
at org.springframework.context.support.PropertySourcesPlaceholderConfigurer$1.getProperty(PropertySourcesPlaceholderConfigurer.java:149)
|
||||
at org.springframework.core.env.PropertySourcesPropertyResolver.getProperty(PropertySourcesPropertyResolver.java:85)
|
||||
at org.springframework.core.env.PropertySourcesPropertyResolver.getPropertyAsRawString(PropertySourcesPropertyResolver.java:74)
|
||||
at org.springframework.util.PropertyPlaceholderHelper.parseStringValue(PropertyPlaceholderHelper.java:153)
|
||||
at org.springframework.util.PropertyPlaceholderHelper.replacePlaceholders(PropertyPlaceholderHelper.java:126)
|
||||
at org.springframework.core.env.AbstractPropertyResolver.doResolvePlaceholders(AbstractPropertyResolver.java:239)
|
||||
at org.springframework.core.env.AbstractPropertyResolver.resolveRequiredPlaceholders(AbstractPropertyResolver.java:210)
|
||||
at org.springframework.context.support.PropertySourcesPlaceholderConfigurer.lambda$processProperties$0(PropertySourcesPlaceholderConfigurer.java:200)
|
||||
at org.springframework.beans.factory.support.AbstractBeanFactory.resolveEmbeddedValue(AbstractBeanFactory.java:964)
|
||||
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1379)
|
||||
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1358)
|
||||
at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:904)
|
||||
at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:782)
|
||||
at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:237)
|
||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1375)
|
||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1212)
|
||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:562)
|
||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:522)
|
||||
... 78 more
|
||||
|
||||
com.example.service.integration_testing.MessageEntryFilterIntegrationTest.classifyMessage_integrationTest_shouldClassifyVariousQueriesAsConversation -- Time elapsed: 0.002 s <<< ERROR!
|
||||
java.lang.IllegalStateException: ApplicationContext failure threshold (1) exceeded: skipping repeated attempt to load context for [ReactiveWebMergedContextConfiguration@57cfb4d8 testClass = com.example.service.integration_testing.MessageEntryFilterIntegrationTest, locations = [], classes = [com.example.Orchestrator], contextInitializerClasses = [], activeProfiles = ["dev"], propertySourceDescriptors = [], propertySourceProperties = ["org.springframework.boot.test.context.SpringBootTestContextBootstrapper=true"], contextCustomizers = [org.springframework.boot.test.context.filter.ExcludeFilterContextCustomizer@7831d1aa, org.springframework.boot.test.json.DuplicateJsonObjectContextCustomizerFactory$DuplicateJsonObjectContextCustomizer@56da8847, org.springframework.boot.test.mock.mockito.MockitoContextCustomizer@0, org.springframework.boot.test.web.client.TestRestTemplateContextCustomizer@5da3f32a, org.springframework.boot.test.web.reactive.server.WebTestClientContextCustomizer@1b36d248, org.springframework.boot.test.web.reactor.netty.DisableReactorResourceFactoryGlobalResourcesContextCustomizerFactory$DisableReactorResourceFactoryGlobalResourcesContextCustomizerCustomizer@66dd04e2, org.springframework.boot.test.autoconfigure.OnFailureConditionReportContextCustomizerFactory$OnFailureConditionReportContextCustomizer@6eded11a, org.springframework.boot.test.autoconfigure.actuate.observability.ObservabilityContextCustomizerFactory$DisableObservabilityContextCustomizer@1f, org.springframework.boot.test.autoconfigure.properties.PropertyMappingContextCustomizer@0, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverContextCustomizer@77a85e76, org.springframework.boot.test.context.SpringBootTestAnnotation@712786df], contextLoader = org.springframework.boot.test.context.SpringBootContextLoader, parent = null]
|
||||
at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:145)
|
||||
at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:130)
|
||||
at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:142)
|
||||
at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.prepareTestInstance(DependencyInjectionTestExecutionListener.java:98)
|
||||
at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:260)
|
||||
at org.springframework.test.context.junit.jupiter.SpringExtension.postProcessTestInstance(SpringExtension.java:163)
|
||||
at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
|
||||
at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:179)
|
||||
at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1708)
|
||||
at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
|
||||
at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
|
||||
at java.base/java.util.stream.StreamSpliterators$WrappingSpliterator.forEachRemaining(StreamSpliterators.java:310)
|
||||
at java.base/java.util.stream.Streams$ConcatSpliterator.forEachRemaining(Streams.java:735)
|
||||
at java.base/java.util.stream.Streams$ConcatSpliterator.forEachRemaining(Streams.java:734)
|
||||
at java.base/java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:762)
|
||||
at java.base/java.util.Optional.orElseGet(Optional.java:364)
|
||||
at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
|
||||
at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
|
||||
|
||||
com.example.service.integration_testing.MessageEntryFilterIntegrationTest.classifyMessage_integrationTest_shouldClassifyVariousConversationalQueriesWithContext -- Time elapsed: 0.001 s <<< ERROR!
|
||||
java.lang.IllegalStateException: ApplicationContext failure threshold (1) exceeded: skipping repeated attempt to load context for [ReactiveWebMergedContextConfiguration@57cfb4d8 testClass = com.example.service.integration_testing.MessageEntryFilterIntegrationTest, locations = [], classes = [com.example.Orchestrator], contextInitializerClasses = [], activeProfiles = ["dev"], propertySourceDescriptors = [], propertySourceProperties = ["org.springframework.boot.test.context.SpringBootTestContextBootstrapper=true"], contextCustomizers = [org.springframework.boot.test.context.filter.ExcludeFilterContextCustomizer@7831d1aa, org.springframework.boot.test.json.DuplicateJsonObjectContextCustomizerFactory$DuplicateJsonObjectContextCustomizer@56da8847, org.springframework.boot.test.mock.mockito.MockitoContextCustomizer@0, org.springframework.boot.test.web.client.TestRestTemplateContextCustomizer@5da3f32a, org.springframework.boot.test.web.reactive.server.WebTestClientContextCustomizer@1b36d248, org.springframework.boot.test.web.reactor.netty.DisableReactorResourceFactoryGlobalResourcesContextCustomizerFactory$DisableReactorResourceFactoryGlobalResourcesContextCustomizerCustomizer@66dd04e2, org.springframework.boot.test.autoconfigure.OnFailureConditionReportContextCustomizerFactory$OnFailureConditionReportContextCustomizer@6eded11a, org.springframework.boot.test.autoconfigure.actuate.observability.ObservabilityContextCustomizerFactory$DisableObservabilityContextCustomizer@1f, org.springframework.boot.test.autoconfigure.properties.PropertyMappingContextCustomizer@0, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverContextCustomizer@77a85e76, org.springframework.boot.test.context.SpringBootTestAnnotation@712786df], contextLoader = org.springframework.boot.test.context.SpringBootContextLoader, parent = null]
|
||||
at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:145)
|
||||
at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:130)
|
||||
at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:142)
|
||||
at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.prepareTestInstance(DependencyInjectionTestExecutionListener.java:98)
|
||||
at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:260)
|
||||
at org.springframework.test.context.junit.jupiter.SpringExtension.postProcessTestInstance(SpringExtension.java:163)
|
||||
at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
|
||||
at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:179)
|
||||
at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1708)
|
||||
at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
|
||||
at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
|
||||
at java.base/java.util.stream.StreamSpliterators$WrappingSpliterator.forEachRemaining(StreamSpliterators.java:310)
|
||||
at java.base/java.util.stream.Streams$ConcatSpliterator.forEachRemaining(Streams.java:735)
|
||||
at java.base/java.util.stream.Streams$ConcatSpliterator.forEachRemaining(Streams.java:734)
|
||||
at java.base/java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:762)
|
||||
at java.base/java.util.Optional.orElseGet(Optional.java:364)
|
||||
at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
|
||||
at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
-------------------------------------------------------------------------------
|
||||
Test set: com.example.service.integration_testing.NotificationContextResolverLiveTest
|
||||
-------------------------------------------------------------------------------
|
||||
Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 0.034 s <<< FAILURE! -- in com.example.service.integration_testing.NotificationContextResolverLiveTest
|
||||
com.example.service.integration_testing.NotificationContextResolverLiveTest.shouldGetLiveResponseFromLlmAndPrintIt -- Time elapsed: 0.002 s <<< ERROR!
|
||||
java.lang.IllegalStateException: ApplicationContext failure threshold (1) exceeded: skipping repeated attempt to load context for [ReactiveWebMergedContextConfiguration@739500b8 testClass = com.example.service.integration_testing.NotificationContextResolverLiveTest, locations = [], classes = [com.example.Orchestrator], contextInitializerClasses = [], activeProfiles = ["dev"], propertySourceDescriptors = [], propertySourceProperties = ["org.springframework.boot.test.context.SpringBootTestContextBootstrapper=true"], contextCustomizers = [org.springframework.boot.test.context.filter.ExcludeFilterContextCustomizer@7831d1aa, org.springframework.boot.test.json.DuplicateJsonObjectContextCustomizerFactory$DuplicateJsonObjectContextCustomizer@56da8847, org.springframework.boot.test.mock.mockito.MockitoContextCustomizer@0, org.springframework.boot.test.web.client.TestRestTemplateContextCustomizer@5da3f32a, org.springframework.boot.test.web.reactive.server.WebTestClientContextCustomizer@1b36d248, org.springframework.boot.test.web.reactor.netty.DisableReactorResourceFactoryGlobalResourcesContextCustomizerFactory$DisableReactorResourceFactoryGlobalResourcesContextCustomizerCustomizer@66dd04e2, org.springframework.boot.test.autoconfigure.OnFailureConditionReportContextCustomizerFactory$OnFailureConditionReportContextCustomizer@6eded11a, org.springframework.boot.test.autoconfigure.actuate.observability.ObservabilityContextCustomizerFactory$DisableObservabilityContextCustomizer@1f, org.springframework.boot.test.autoconfigure.properties.PropertyMappingContextCustomizer@0, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverContextCustomizer@77a85e76, org.springframework.boot.test.context.SpringBootTestAnnotation@712786df], contextLoader = org.springframework.boot.test.context.SpringBootContextLoader, parent = null]
|
||||
at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:145)
|
||||
at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:130)
|
||||
at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:142)
|
||||
at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.prepareTestInstance(DependencyInjectionTestExecutionListener.java:98)
|
||||
at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:260)
|
||||
at org.springframework.test.context.junit.jupiter.SpringExtension.postProcessTestInstance(SpringExtension.java:163)
|
||||
at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
|
||||
at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:179)
|
||||
at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1708)
|
||||
at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
|
||||
at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
|
||||
at java.base/java.util.stream.StreamSpliterators$WrappingSpliterator.forEachRemaining(StreamSpliterators.java:310)
|
||||
at java.base/java.util.stream.Streams$ConcatSpliterator.forEachRemaining(Streams.java:735)
|
||||
at java.base/java.util.stream.Streams$ConcatSpliterator.forEachRemaining(Streams.java:734)
|
||||
at java.base/java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:762)
|
||||
at java.base/java.util.Optional.orElseGet(Optional.java:364)
|
||||
at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
|
||||
at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
|
||||
|
||||
@@ -0,0 +1,89 @@
|
||||
-------------------------------------------------------------------------------
|
||||
Test set: com.example.service.integration_testing.RagClientIntegrationTest
|
||||
-------------------------------------------------------------------------------
|
||||
Tests run: 10, Failures: 2, Errors: 0, Skipped: 0, Time elapsed: 25.04 s <<< FAILURE! -- in com.example.service.integration_testing.RagClientIntegrationTest
|
||||
com.example.service.integration_testing.RagClientIntegrationTest.detectIntent_withTimeout_shouldFailWithTimeoutError -- Time elapsed: 10.08 s <<< FAILURE!
|
||||
java.lang.AssertionError: VerifySubscriber timed out on reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber@62284954
|
||||
at reactor.test.MessageFormatter.assertionError(MessageFormatter.java:115)
|
||||
at reactor.test.DefaultStepVerifierBuilder$DefaultVerifySubscriber.pollTaskEventOrComplete(DefaultStepVerifierBuilder.java:1728)
|
||||
at reactor.test.DefaultStepVerifierBuilder$DefaultVerifySubscriber.verify(DefaultStepVerifierBuilder.java:1298)
|
||||
at reactor.test.DefaultStepVerifierBuilder$DefaultStepVerifier.verify(DefaultStepVerifierBuilder.java:832)
|
||||
at com.example.service.integration_testing.RagClientIntegrationTest.detectIntent_withTimeout_shouldFailWithTimeoutError(RagClientIntegrationTest.java:302)
|
||||
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
|
||||
at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
|
||||
at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
|
||||
|
||||
com.example.service.integration_testing.RagClientIntegrationTest.detectIntent_with500Error_shouldRetryAndFail -- Time elapsed: 10.78 s <<< FAILURE!
|
||||
java.lang.AssertionError: expectation "expectErrorMatches" failed (predicate failed on exception: com.example.exception.RagClientException: RAG request timeout after 5s)
|
||||
at reactor.test.MessageFormatter.assertionError(MessageFormatter.java:115)
|
||||
at reactor.test.MessageFormatter.failPrefix(MessageFormatter.java:104)
|
||||
at reactor.test.MessageFormatter.fail(MessageFormatter.java:73)
|
||||
at reactor.test.MessageFormatter.failOptional(MessageFormatter.java:88)
|
||||
at reactor.test.DefaultStepVerifierBuilder.lambda$expectErrorMatches$8(DefaultStepVerifierBuilder.java:420)
|
||||
at reactor.test.DefaultStepVerifierBuilder$SignalEvent.test(DefaultStepVerifierBuilder.java:2289)
|
||||
at reactor.test.DefaultStepVerifierBuilder$DefaultVerifySubscriber.onSignal(DefaultStepVerifierBuilder.java:1529)
|
||||
at reactor.test.DefaultStepVerifierBuilder$DefaultVerifySubscriber.onExpectation(DefaultStepVerifierBuilder.java:1477)
|
||||
at reactor.test.DefaultStepVerifierBuilder$DefaultVerifySubscriber.onError(DefaultStepVerifierBuilder.java:1129)
|
||||
at reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.onError(MonoPeekTerminal.java:258)
|
||||
at reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.onError(MonoPeekTerminal.java:258)
|
||||
at reactor.core.publisher.FluxMap$MapConditionalSubscriber.onError(FluxMap.java:265)
|
||||
at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onError(FluxOnErrorResume.java:106)
|
||||
at reactor.core.publisher.Operators.error(Operators.java:198)
|
||||
at reactor.core.publisher.MonoError.subscribe(MonoError.java:53)
|
||||
at reactor.core.publisher.Mono.subscribe(Mono.java:4576)
|
||||
at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onError(FluxOnErrorResume.java:103)
|
||||
at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onError(FluxOnErrorResume.java:106)
|
||||
at reactor.core.publisher.Operators.error(Operators.java:198)
|
||||
at reactor.core.publisher.MonoError.subscribe(MonoError.java:53)
|
||||
at reactor.core.publisher.Mono.subscribe(Mono.java:4576)
|
||||
at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onError(FluxOnErrorResume.java:103)
|
||||
at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onError(FluxOnErrorResume.java:106)
|
||||
at reactor.core.publisher.Operators.error(Operators.java:198)
|
||||
at reactor.core.publisher.MonoError.subscribe(MonoError.java:53)
|
||||
at reactor.core.publisher.Mono.subscribe(Mono.java:4576)
|
||||
at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onError(FluxOnErrorResume.java:103)
|
||||
at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onError(FluxOnErrorResume.java:106)
|
||||
at reactor.core.publisher.Operators.error(Operators.java:198)
|
||||
at reactor.core.publisher.MonoError.subscribe(MonoError.java:53)
|
||||
at reactor.core.publisher.Mono.subscribe(Mono.java:4576)
|
||||
at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onError(FluxOnErrorResume.java:103)
|
||||
at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onError(FluxOnErrorResume.java:106)
|
||||
at reactor.core.publisher.Operators.error(Operators.java:198)
|
||||
at reactor.core.publisher.MonoError.subscribe(MonoError.java:53)
|
||||
at reactor.core.publisher.Mono.subscribe(Mono.java:4576)
|
||||
at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onError(FluxOnErrorResume.java:103)
|
||||
at reactor.core.publisher.SerializedSubscriber.onError(SerializedSubscriber.java:124)
|
||||
at reactor.core.publisher.FluxRetryWhen$RetryWhenMainSubscriber.whenError(FluxRetryWhen.java:229)
|
||||
at reactor.core.publisher.FluxRetryWhen$RetryWhenOtherSubscriber.onError(FluxRetryWhen.java:279)
|
||||
at reactor.core.publisher.FluxContextWrite$ContextWriteSubscriber.onError(FluxContextWrite.java:121)
|
||||
at reactor.core.publisher.FluxConcatMapNoPrefetch$FluxConcatMapNoPrefetchSubscriber.maybeOnError(FluxConcatMapNoPrefetch.java:327)
|
||||
at reactor.core.publisher.FluxConcatMapNoPrefetch$FluxConcatMapNoPrefetchSubscriber.onNext(FluxConcatMapNoPrefetch.java:212)
|
||||
at reactor.core.publisher.FluxContextWrite$ContextWriteSubscriber.onNext(FluxContextWrite.java:107)
|
||||
at reactor.core.publisher.SinkManyEmitterProcessor.drain(SinkManyEmitterProcessor.java:476)
|
||||
at reactor.core.publisher.SinkManyEmitterProcessor.tryEmitNext(SinkManyEmitterProcessor.java:273)
|
||||
at reactor.core.publisher.SinkManySerialized.tryEmitNext(SinkManySerialized.java:100)
|
||||
at reactor.core.publisher.InternalManySink.emitNext(InternalManySink.java:27)
|
||||
at reactor.core.publisher.FluxRetryWhen$RetryWhenMainSubscriber.onError(FluxRetryWhen.java:194)
|
||||
at reactor.core.publisher.SerializedSubscriber.onError(SerializedSubscriber.java:124)
|
||||
at reactor.core.publisher.FluxTimeout$TimeoutMainSubscriber.handleTimeout(FluxTimeout.java:296)
|
||||
at reactor.core.publisher.FluxTimeout$TimeoutMainSubscriber.doTimeout(FluxTimeout.java:281)
|
||||
at reactor.core.publisher.FluxTimeout$TimeoutTimeoutSubscriber.onNext(FluxTimeout.java:420)
|
||||
at reactor.core.publisher.FluxOnErrorReturn$ReturnSubscriber.onNext(FluxOnErrorReturn.java:162)
|
||||
at reactor.core.publisher.MonoDelay$MonoDelayRunnable.propagateDelay(MonoDelay.java:270)
|
||||
at reactor.core.publisher.MonoDelay$MonoDelayRunnable.run(MonoDelay.java:285)
|
||||
at reactor.core.scheduler.SchedulerTask.call(SchedulerTask.java:68)
|
||||
at reactor.core.scheduler.SchedulerTask.call(SchedulerTask.java:28)
|
||||
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317)
|
||||
at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:304)
|
||||
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)
|
||||
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)
|
||||
at java.base/java.lang.Thread.run(Thread.java:1583)
|
||||
Suppressed: com.example.exception.RagClientException: RAG request timeout after 5s
|
||||
at com.example.service.base.RagClientService.lambda$9(RagClientService.java:169)
|
||||
at reactor.core.publisher.Mono.lambda$onErrorMap$28(Mono.java:3848)
|
||||
at reactor.core.publisher.Mono.lambda$onErrorResume$30(Mono.java:3938)
|
||||
at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onError(FluxOnErrorResume.java:94)
|
||||
... 36 more
|
||||
Caused by: java.util.concurrent.TimeoutException: Did not observe any item or terminal signal within 5000ms in 'flatMap' (and no fallback has been configured)
|
||||
... 13 more
|
||||
|
||||
@@ -0,0 +1,35 @@
|
||||
-------------------------------------------------------------------------------
|
||||
Test set: com.example.service.llm.LlmResponseTunerServiceImplTest
|
||||
-------------------------------------------------------------------------------
|
||||
Tests run: 2, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 0.301 s <<< FAILURE! -- in com.example.service.llm.LlmResponseTunerServiceImplTest
|
||||
com.example.service.llm.LlmResponseTunerServiceImplTest.setValue_shouldSetValueInRedis -- Time elapsed: 0.295 s <<< ERROR!
|
||||
org.mockito.exceptions.misusing.PotentialStubbingProblem:
|
||||
|
||||
Strict stubbing argument mismatch. Please check:
|
||||
- this invocation of 'set' method:
|
||||
reactiveValueOperations.set(
|
||||
"llm-pre-response:test_key",
|
||||
"test_value",
|
||||
PT1H
|
||||
);
|
||||
-> at com.example.service.llm.LlmResponseTunerServiceImpl.setValue(LlmResponseTunerServiceImpl.java:31)
|
||||
- has following stubbing(s) with different arguments:
|
||||
1. reactiveValueOperations.set(
|
||||
"llm-pre-response:test_key",
|
||||
"test_value"
|
||||
);
|
||||
-> at com.example.service.llm.LlmResponseTunerServiceImplTest.setValue_shouldSetValueInRedis(LlmResponseTunerServiceImplTest.java:52)
|
||||
Typically, stubbing argument mismatch indicates user mistake when writing tests.
|
||||
Mockito fails early so that you can debug potential problem easily.
|
||||
However, there are legit scenarios when this exception generates false negative signal:
|
||||
- stubbing the same method multiple times using 'given().will()' or 'when().then()' API
|
||||
Please use 'will().given()' or 'doReturn().when()' API for stubbing.
|
||||
- stubbed method is intentionally invoked with different arguments by code under test
|
||||
Please use default or 'silent' JUnit Rule (equivalent of Strictness.LENIENT).
|
||||
For more information see javadoc for PotentialStubbingProblem class.
|
||||
at com.example.service.llm.LlmResponseTunerServiceImpl.setValue(LlmResponseTunerServiceImpl.java:31)
|
||||
at com.example.service.llm.LlmResponseTunerServiceImplTest.setValue_shouldSetValueInRedis(LlmResponseTunerServiceImplTest.java:54)
|
||||
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
|
||||
at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
|
||||
at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
|
||||
|
||||
@@ -0,0 +1,28 @@
|
||||
-------------------------------------------------------------------------------
|
||||
Test set: com.example.service.unit_testing.DialogflowClientServiceTest
|
||||
-------------------------------------------------------------------------------
|
||||
Tests run: 7, Failures: 1, Errors: 0, Skipped: 0, Time elapsed: 8.974 s <<< FAILURE! -- in com.example.service.unit_testing.DialogflowClientServiceTest
|
||||
com.example.service.unit_testing.DialogflowClientServiceTest.detectIntent_whenSuccess_shouldReturnMappedResponse -- Time elapsed: 0.478 s <<< FAILURE!
|
||||
Wanted but not invoked:
|
||||
mockSessionsClient.detectIntent(
|
||||
session: "projects/test-project/locations/us-central1/agents/test-agent/sessions/test-session-123"
|
||||
|
||||
);
|
||||
-> at com.google.cloud.dialogflow.cx.v3.SessionsClient.detectIntent(SessionsClient.java:326)
|
||||
|
||||
However, there was exactly 1 interaction with this mock:
|
||||
mockSessionsClient.detectIntent(
|
||||
session: "projects/test-project/locations/us-central1/agents/test-agent/sessions/test-session-123"
|
||||
query_params {
|
||||
}
|
||||
|
||||
);
|
||||
-> at com.example.service.base.DialogflowClientService.lambda$0(DialogflowClientService.java:127)
|
||||
|
||||
|
||||
at com.google.cloud.dialogflow.cx.v3.SessionsClient.detectIntent(SessionsClient.java:326)
|
||||
at com.example.service.unit_testing.DialogflowClientServiceTest.detectIntent_whenSuccess_shouldReturnMappedResponse(DialogflowClientServiceTest.java:110)
|
||||
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
|
||||
at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
|
||||
at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
|
||||
|
||||
@@ -0,0 +1,85 @@
|
||||
-------------------------------------------------------------------------------
|
||||
Test set: com.example.service.unit_testing.GeminiClientServiceTest
|
||||
-------------------------------------------------------------------------------
|
||||
Tests run: 5, Failures: 0, Errors: 5, Skipped: 0, Time elapsed: 0.495 s <<< FAILURE! -- in com.example.service.unit_testing.GeminiClientServiceTest
|
||||
com.example.service.unit_testing.GeminiClientServiceTest.generateContent_whenUnexpectedExceptionOccurs_throwsGeminiClientException -- Time elapsed: 0.073 s <<< ERROR!
|
||||
java.lang.NullPointerException: Cannot invoke "com.google.genai.Models.generateContent(String, com.google.genai.types.Content, com.google.genai.types.GenerateContentConfig)" because "this.geminiClient.models" is null
|
||||
at com.example.service.unit_testing.GeminiClientServiceTest.generateContent_whenUnexpectedExceptionOccurs_throwsGeminiClientException(GeminiClientServiceTest .java:115)
|
||||
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
|
||||
at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
|
||||
at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
|
||||
|
||||
com.example.service.unit_testing.GeminiClientServiceTest.generateContent_whenGenAiIOExceptionOccurs_throwsGeminiClientException -- Time elapsed: 0.004 s <<< ERROR!
|
||||
org.mockito.exceptions.misusing.InvalidUseOfMatchersException:
|
||||
|
||||
Misplaced or misused argument matcher detected here:
|
||||
|
||||
-> at com.example.service.unit_testing.GeminiClientServiceTest.generateContent_whenUnexpectedExceptionOccurs_throwsGeminiClientException(GeminiClientServiceTest .java:115)
|
||||
-> at com.example.service.unit_testing.GeminiClientServiceTest.generateContent_whenUnexpectedExceptionOccurs_throwsGeminiClientException(GeminiClientServiceTest .java:115)
|
||||
-> at com.example.service.unit_testing.GeminiClientServiceTest.generateContent_whenUnexpectedExceptionOccurs_throwsGeminiClientException(GeminiClientServiceTest .java:115)
|
||||
|
||||
You cannot use argument matchers outside of verification or stubbing.
|
||||
Examples of correct usage of argument matchers:
|
||||
when(mock.get(anyInt())).thenReturn(null);
|
||||
doThrow(new RuntimeException()).when(mock).someVoidMethod(any());
|
||||
verify(mock).someMethod(contains("foo"))
|
||||
|
||||
This message may appear after an NullPointerException if the last matcher is returning an object
|
||||
like any() but the stubbed method signature expect a primitive argument, in this case,
|
||||
use primitive alternatives.
|
||||
when(mock.get(any())); // bad use, will raise NPE
|
||||
when(mock.get(anyInt())); // correct usage use
|
||||
|
||||
Also, this error might show up because you use argument matchers with methods that cannot be mocked.
|
||||
Following methods *cannot* be stubbed/verified: final/private/equals()/hashCode().
|
||||
Mocking methods declared on non-public parent classes is not supported.
|
||||
|
||||
at com.example.service.unit_testing.GeminiClientServiceTest.setUp(GeminiClientServiceTest .java:50)
|
||||
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
|
||||
at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
|
||||
at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
|
||||
|
||||
com.example.service.unit_testing.GeminiClientServiceTest.generateContent_whenResponseTextIsNull_throwsGeminiClientException -- Time elapsed: 0.404 s <<< ERROR!
|
||||
java.lang.NullPointerException: Cannot invoke "com.google.genai.Models.generateContent(String, com.google.genai.types.Content, com.google.genai.types.GenerateContentConfig)" because "this.geminiClient.models" is null
|
||||
at com.example.service.unit_testing.GeminiClientServiceTest.generateContent_whenResponseTextIsNull_throwsGeminiClientException(GeminiClientServiceTest .java:87)
|
||||
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
|
||||
at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
|
||||
at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
|
||||
|
||||
com.example.service.unit_testing.GeminiClientServiceTest.generateContent_whenApiSucceeds_returnsGeneratedText -- Time elapsed: 0.003 s <<< ERROR!
|
||||
org.mockito.exceptions.misusing.InvalidUseOfMatchersException:
|
||||
|
||||
Misplaced or misused argument matcher detected here:
|
||||
|
||||
-> at com.example.service.unit_testing.GeminiClientServiceTest.generateContent_whenResponseTextIsNull_throwsGeminiClientException(GeminiClientServiceTest .java:87)
|
||||
-> at com.example.service.unit_testing.GeminiClientServiceTest.generateContent_whenResponseTextIsNull_throwsGeminiClientException(GeminiClientServiceTest .java:87)
|
||||
-> at com.example.service.unit_testing.GeminiClientServiceTest.generateContent_whenResponseTextIsNull_throwsGeminiClientException(GeminiClientServiceTest .java:87)
|
||||
|
||||
You cannot use argument matchers outside of verification or stubbing.
|
||||
Examples of correct usage of argument matchers:
|
||||
when(mock.get(anyInt())).thenReturn(null);
|
||||
doThrow(new RuntimeException()).when(mock).someVoidMethod(any());
|
||||
verify(mock).someMethod(contains("foo"))
|
||||
|
||||
This message may appear after an NullPointerException if the last matcher is returning an object
|
||||
like any() but the stubbed method signature expect a primitive argument, in this case,
|
||||
use primitive alternatives.
|
||||
when(mock.get(any())); // bad use, will raise NPE
|
||||
when(mock.get(anyInt())); // correct usage use
|
||||
|
||||
Also, this error might show up because you use argument matchers with methods that cannot be mocked.
|
||||
Following methods *cannot* be stubbed/verified: final/private/equals()/hashCode().
|
||||
Mocking methods declared on non-public parent classes is not supported.
|
||||
|
||||
at com.example.service.unit_testing.GeminiClientServiceTest.setUp(GeminiClientServiceTest .java:50)
|
||||
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
|
||||
at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
|
||||
at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
|
||||
|
||||
com.example.service.unit_testing.GeminiClientServiceTest.generateContent_whenApiResponseIsNull_throwsGeminiClientException -- Time elapsed: 0.002 s <<< ERROR!
|
||||
java.lang.NullPointerException: Cannot invoke "com.google.genai.Models.generateContent(String, com.google.genai.types.Content, com.google.genai.types.GenerateContentConfig)" because "this.geminiClient.models" is null
|
||||
at com.example.service.unit_testing.GeminiClientServiceTest.generateContent_whenApiResponseIsNull_throwsGeminiClientException(GeminiClientServiceTest .java:72)
|
||||
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
|
||||
at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
|
||||
at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
|
||||
|
||||
@@ -0,0 +1,404 @@
|
||||
-------------------------------------------------------------------------------
|
||||
Test set: com.example.service.unit_testing.MessageEntryFilterTest
|
||||
-------------------------------------------------------------------------------
|
||||
Tests run: 11, Failures: 6, Errors: 0, Skipped: 0, Time elapsed: 0.125 s <<< FAILURE! -- in com.example.service.unit_testing.MessageEntryFilterTest
|
||||
com.example.service.unit_testing.MessageEntryFilterTest.classifyMessage_shouldNotIncludeNotificationContextInPromptWhenBlank -- Time elapsed: 0.005 s <<< FAILURE!
|
||||
Wanted but not invoked:
|
||||
geminiService.generateContent(
|
||||
<custom argument matcher>,
|
||||
<any float>,
|
||||
<any integer>,
|
||||
<any java.lang.String>,
|
||||
<any float>
|
||||
);
|
||||
-> at com.example.service.base.GeminiClientService.generateContent(GeminiClientService.java:36)
|
||||
|
||||
However, there was exactly 1 interaction with this mock:
|
||||
geminiService.generateContent(
|
||||
"Hay un sistema de conversaciones entre un agente y un usuario. Durante
|
||||
la conversación, una notificación puede entrar a la conversación de forma
|
||||
abrupta, de tal forma que la siguiente interacción del usuario después
|
||||
de la notificación puede corresponder a la conversación que estaba
|
||||
sucediendo o puede ser un seguimiento a la notificación.
|
||||
|
||||
Tu tarea es identificar si la siguiente interacción del usuario es un
|
||||
seguimiento a la notificación o una continuación de la conversación.
|
||||
|
||||
Recibirás esta información:
|
||||
|
||||
- HISTORIAL_CONVERSACION: El diálogo entre el agente y el usuario antes
|
||||
de la notificación.
|
||||
- INTERRUPCION_NOTIFICACION: La notificación. Esta puede o no traer parámetros
|
||||
los cuales refieren a detalles específicos de la notificación. Por ejemplo:
|
||||
{ "vigencia": “12 de septiembre de 2025”, "credito_tipo" : "platinum" }
|
||||
- INTERACCION_USUARIO: La siguiente interacción del usuario después de
|
||||
la notificación.
|
||||
|
||||
Reglas:
|
||||
- Solo debes responder una palabra: NOTIFICATION o CONVERSATION. No agregues
|
||||
o inventes otra palabra.
|
||||
- Clasifica como NOTIFICATION si la siguiente interacción del usuario
|
||||
es una clara respuesta o seguimiento a la notificación.
|
||||
- Clasifica como CONVERSATION si la siguiente interacción del usuario
|
||||
es un claro seguimiento al histórico de la conversación.
|
||||
- Si la siguiente interacción del usuario es ambigua, clasifica
|
||||
como CONVERSATION.
|
||||
|
||||
Ejemplos:
|
||||
|
||||
Ejemplo 1:
|
||||
HISTORIAL_CONVERSACION:
|
||||
Agente: Claro, para un crédito de vehículo, las tasas actuales inician en el 1.2% mensual.
|
||||
Usuario: Entiendo, ¿y el plazo máximo de cuánto sería?
|
||||
INTERRUPCION_NOTIFICACION:
|
||||
Tu pago de la tarjeta de crédito por $1,500.00 ha sido procesado.
|
||||
INTERACCION_USUARIO:
|
||||
perfecto, cuando es la fecha de corte?
|
||||
Clasificación: NOTIFICACION
|
||||
|
||||
Ejemplo 2:
|
||||
HISTORIAL_CONVERSACION:
|
||||
Agente: No es necesario, puedes completar todo el proceso para abrir tu cuenta desde nuestra app.
|
||||
Usuario: Ok
|
||||
Agente: ¿Necesitas algo más?
|
||||
INTERRUPCION_NOTIFICACION:
|
||||
Tu estado de cuenta de Julio ya está disponible.
|
||||
Parametros: {"fecha_corte": "30 de Agosto del 2025", "tipo_cuenta": "credito"}
|
||||
INTERACCION_USUARIO:
|
||||
que documentos necesito?
|
||||
Clasificación: CONVERSACION
|
||||
|
||||
Ejemplo 3:
|
||||
HISTORIAL_CONVERSACION:
|
||||
Agente: Ese fondo de inversión tiene un perfil de alto riesgo, pero históricamente ha dado un rendimiento superior al 15% anual.
|
||||
Usuario: ok, entiendo
|
||||
INTERRUPCION_NOTIFICACION:
|
||||
Alerta: Tu cuenta de ahorros tiene un saldo bajo de $50.00.
|
||||
Parametros: {"fecha_retiro": "5 de septiembre del 2025", "tipo_cuenta": "ahorros"}
|
||||
INTERACCION_USUARIO:
|
||||
cuando fue el ultimo retiro?
|
||||
Clasificación: NOTIFICACION
|
||||
|
||||
Ejemplo 4:
|
||||
HISTORIAL_CONVERSACION:
|
||||
Usuario: Que es el CAT?
|
||||
Agente: El CAT (Costo Anual Total) es un indicador financiero, expresado en un porcentaje anual, que refleja el costo total de un crédito, incluyendo no solo la tasa de interés, sino también todas las comisiones, gastos y otros cobros que genera.
|
||||
INTERRUPCION_NOTIFICACION:
|
||||
Alerta: Se realizó un retiro en efectivo por $100.
|
||||
INTERACCION_USUARIO:
|
||||
y este se aplica solo si dejo de pagar?
|
||||
Clasificación: CONVERSACION
|
||||
|
||||
Ejemplo 5:
|
||||
HISTORIAL_CONVERSACION:
|
||||
Usuario: Cual es la tasa de hipoteca que manejan?
|
||||
Agente: La tasa de una hipoteca depende tanto de factores económicos generales (inflación, tasas de referencia del banco central) como de factores individuales del solicitante (historial crediticio, monto del pago inicial, ingresos, endeudamiento, etc.)
|
||||
INTERRUPCION_NOTIFICACION:
|
||||
Hola, [Alias]: Pasó algo con la captura de tu INE y no se completó tu solicitud de tarjeta de crédito con folio 3421.
|
||||
Parametros: {“solicitud_tarjeta_credito_vigencia”: “12 de septiembre de 2025”, “solicitud_tarjeta_credito_error”: “Error con el formato de la captura”, “solicitud_tarjeta_credito_tipo” : “platinum” }
|
||||
INTERACCION_USUARIO:
|
||||
cual fue el error?
|
||||
Clasificación: NOTIFICACION
|
||||
|
||||
Tarea:
|
||||
HISTORIAL_CONVERSACION:
|
||||
No conversation history.
|
||||
INTERRUPCION_NOTIFICACION:
|
||||
No interrupting notification.
|
||||
INTERACCION_USUARIO:
|
||||
What's up?
|
||||
Clasificación:
|
||||
",
|
||||
0.1f,
|
||||
10,
|
||||
"gemini-2.0-flash-001",
|
||||
0.1f
|
||||
);
|
||||
-> at com.example.service.base.MessageEntryFilter.classifyMessage(MessageEntryFilter.java:99)
|
||||
|
||||
|
||||
at com.example.service.base.GeminiClientService.generateContent(GeminiClientService.java:36)
|
||||
at com.example.service.unit_testing.MessageEntryFilterTest.classifyMessage_shouldNotIncludeNotificationContextInPromptWhenBlank(MessageEntryFilterTest.java:245)
|
||||
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
|
||||
at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
|
||||
at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
|
||||
|
||||
com.example.service.unit_testing.MessageEntryFilterTest.classifyMessage_shouldReturnNotification_whenGeminiRespondsNotificationWithContext -- Time elapsed: 0.008 s <<< FAILURE!
|
||||
org.opentest4j.AssertionFailedError: Log message for successful classification not found. ==> expected: not <null>
|
||||
at org.junit.jupiter.api.AssertionFailureBuilder.build(AssertionFailureBuilder.java:152)
|
||||
at org.junit.jupiter.api.AssertionFailureBuilder.buildAndThrow(AssertionFailureBuilder.java:132)
|
||||
at org.junit.jupiter.api.AssertNotNull.failNull(AssertNotNull.java:49)
|
||||
at org.junit.jupiter.api.AssertNotNull.assertNotNull(AssertNotNull.java:35)
|
||||
at org.junit.jupiter.api.Assertions.assertNotNull(Assertions.java:312)
|
||||
at com.example.service.unit_testing.MessageEntryFilterTest.classifyMessage_shouldReturnNotification_whenGeminiRespondsNotificationWithContext(MessageEntryFilterTest.java:139)
|
||||
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
|
||||
at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
|
||||
at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
|
||||
|
||||
com.example.service.unit_testing.MessageEntryFilterTest.classifyMessage_shouldReturnError_whenGeminiServiceThrowsException -- Time elapsed: 0.008 s <<< FAILURE!
|
||||
org.opentest4j.AssertionFailedError: expected: <ERROR> but was: <UNKNOWN>
|
||||
at org.junit.jupiter.api.AssertionFailureBuilder.build(AssertionFailureBuilder.java:151)
|
||||
at org.junit.jupiter.api.AssertionFailureBuilder.buildAndThrow(AssertionFailureBuilder.java:132)
|
||||
at org.junit.jupiter.api.AssertEquals.failNotEqual(AssertEquals.java:197)
|
||||
at org.junit.jupiter.api.AssertEquals.assertEquals(AssertEquals.java:182)
|
||||
at org.junit.jupiter.api.AssertEquals.assertEquals(AssertEquals.java:177)
|
||||
at org.junit.jupiter.api.Assertions.assertEquals(Assertions.java:1145)
|
||||
at com.example.service.unit_testing.MessageEntryFilterTest.classifyMessage_shouldReturnError_whenGeminiServiceThrowsException(MessageEntryFilterTest.java:208)
|
||||
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
|
||||
at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
|
||||
at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
|
||||
|
||||
com.example.service.unit_testing.MessageEntryFilterTest.classifyMessage_shouldIncludeNotificationContextInPrompt -- Time elapsed: 0.008 s <<< FAILURE!
|
||||
Wanted but not invoked:
|
||||
geminiService.generateContent(
|
||||
<custom argument matcher>,
|
||||
<any float>,
|
||||
<any integer>,
|
||||
<any java.lang.String>,
|
||||
<any float>
|
||||
);
|
||||
-> at com.example.service.base.GeminiClientService.generateContent(GeminiClientService.java:36)
|
||||
|
||||
However, there was exactly 1 interaction with this mock:
|
||||
geminiService.generateContent(
|
||||
"Hay un sistema de conversaciones entre un agente y un usuario. Durante
|
||||
la conversación, una notificación puede entrar a la conversación de forma
|
||||
abrupta, de tal forma que la siguiente interacción del usuario después
|
||||
de la notificación puede corresponder a la conversación que estaba
|
||||
sucediendo o puede ser un seguimiento a la notificación.
|
||||
|
||||
Tu tarea es identificar si la siguiente interacción del usuario es un
|
||||
seguimiento a la notificación o una continuación de la conversación.
|
||||
|
||||
Recibirás esta información:
|
||||
|
||||
- HISTORIAL_CONVERSACION: El diálogo entre el agente y el usuario antes
|
||||
de la notificación.
|
||||
- INTERRUPCION_NOTIFICACION: La notificación. Esta puede o no traer parámetros
|
||||
los cuales refieren a detalles específicos de la notificación. Por ejemplo:
|
||||
{ "vigencia": “12 de septiembre de 2025”, "credito_tipo" : "platinum" }
|
||||
- INTERACCION_USUARIO: La siguiente interacción del usuario después de
|
||||
la notificación.
|
||||
|
||||
Reglas:
|
||||
- Solo debes responder una palabra: NOTIFICATION o CONVERSATION. No agregues
|
||||
o inventes otra palabra.
|
||||
- Clasifica como NOTIFICATION si la siguiente interacción del usuario
|
||||
es una clara respuesta o seguimiento a la notificación.
|
||||
- Clasifica como CONVERSATION si la siguiente interacción del usuario
|
||||
es un claro seguimiento al histórico de la conversación.
|
||||
- Si la siguiente interacción del usuario es ambigua, clasifica
|
||||
como CONVERSATION.
|
||||
|
||||
Ejemplos:
|
||||
|
||||
Ejemplo 1:
|
||||
HISTORIAL_CONVERSACION:
|
||||
Agente: Claro, para un crédito de vehículo, las tasas actuales inician en el 1.2% mensual.
|
||||
Usuario: Entiendo, ¿y el plazo máximo de cuánto sería?
|
||||
INTERRUPCION_NOTIFICACION:
|
||||
Tu pago de la tarjeta de crédito por $1,500.00 ha sido procesado.
|
||||
INTERACCION_USUARIO:
|
||||
perfecto, cuando es la fecha de corte?
|
||||
Clasificación: NOTIFICACION
|
||||
|
||||
Ejemplo 2:
|
||||
HISTORIAL_CONVERSACION:
|
||||
Agente: No es necesario, puedes completar todo el proceso para abrir tu cuenta desde nuestra app.
|
||||
Usuario: Ok
|
||||
Agente: ¿Necesitas algo más?
|
||||
INTERRUPCION_NOTIFICACION:
|
||||
Tu estado de cuenta de Julio ya está disponible.
|
||||
Parametros: {"fecha_corte": "30 de Agosto del 2025", "tipo_cuenta": "credito"}
|
||||
INTERACCION_USUARIO:
|
||||
que documentos necesito?
|
||||
Clasificación: CONVERSACION
|
||||
|
||||
Ejemplo 3:
|
||||
HISTORIAL_CONVERSACION:
|
||||
Agente: Ese fondo de inversión tiene un perfil de alto riesgo, pero históricamente ha dado un rendimiento superior al 15% anual.
|
||||
Usuario: ok, entiendo
|
||||
INTERRUPCION_NOTIFICACION:
|
||||
Alerta: Tu cuenta de ahorros tiene un saldo bajo de $50.00.
|
||||
Parametros: {"fecha_retiro": "5 de septiembre del 2025", "tipo_cuenta": "ahorros"}
|
||||
INTERACCION_USUARIO:
|
||||
cuando fue el ultimo retiro?
|
||||
Clasificación: NOTIFICACION
|
||||
|
||||
Ejemplo 4:
|
||||
HISTORIAL_CONVERSACION:
|
||||
Usuario: Que es el CAT?
|
||||
Agente: El CAT (Costo Anual Total) es un indicador financiero, expresado en un porcentaje anual, que refleja el costo total de un crédito, incluyendo no solo la tasa de interés, sino también todas las comisiones, gastos y otros cobros que genera.
|
||||
INTERRUPCION_NOTIFICACION:
|
||||
Alerta: Se realizó un retiro en efectivo por $100.
|
||||
INTERACCION_USUARIO:
|
||||
y este se aplica solo si dejo de pagar?
|
||||
Clasificación: CONVERSACION
|
||||
|
||||
Ejemplo 5:
|
||||
HISTORIAL_CONVERSACION:
|
||||
Usuario: Cual es la tasa de hipoteca que manejan?
|
||||
Agente: La tasa de una hipoteca depende tanto de factores económicos generales (inflación, tasas de referencia del banco central) como de factores individuales del solicitante (historial crediticio, monto del pago inicial, ingresos, endeudamiento, etc.)
|
||||
INTERRUPCION_NOTIFICACION:
|
||||
Hola, [Alias]: Pasó algo con la captura de tu INE y no se completó tu solicitud de tarjeta de crédito con folio 3421.
|
||||
Parametros: {“solicitud_tarjeta_credito_vigencia”: “12 de septiembre de 2025”, “solicitud_tarjeta_credito_error”: “Error con el formato de la captura”, “solicitud_tarjeta_credito_tipo” : “platinum” }
|
||||
INTERACCION_USUARIO:
|
||||
cual fue el error?
|
||||
Clasificación: NOTIFICACION
|
||||
|
||||
Tarea:
|
||||
HISTORIAL_CONVERSACION:
|
||||
{"sessionId":"ec9f3731-59ac-4bd0-849e-f45fcc18436d","userId":"user_by_phone_0102030405060708","telefono":"0102030405060708","createdAt":"2025-08-06T20:35:05.123699404Z","lastModified":"2025-08-06T20:35:05.984574281Z","entries":[{"type":"USUARIO","timestamp":"2025-08-06T20:35:05.123516916Z","text":"Hola que tal"},{"type":"SISTEMA","timestamp":"2025-08-06T20:35:05.967828173Z","text":"\u00a1Hola! Bienvenido a Banorte, te saluda Beto. \u00bfEn qu\u00e9 te puedo ayudar? \uD83D\uDE0A","parameters":{"canal":"banortec","telefono":"0102030405060708","pantalla_contexto":"transferencias","usuario_id":"user_by_phone_0102030405060708","nickname":"John Doe"}}]}
|
||||
INTERRUPCION_NOTIFICACION:
|
||||
{"idNotificacion":"4c2992d3-539d-4b28-8d52-cdea02cd1c75","timestampCreacion":"2025-08-01T16:14:02.301671204Z","texto":"Tu estado de cuenta de Agosto esta listo","nombreEventoDialogflow":"notificacion","codigoIdiomaDialogflow":"es","parametros":{"notificacion_texto":"Tu estado de cuenta de Agosto esta listo","telefono":"555555555"}}
|
||||
INTERACCION_USUARIO:
|
||||
What's up?
|
||||
Clasificación:
|
||||
",
|
||||
0.1f,
|
||||
10,
|
||||
"gemini-2.0-flash-001",
|
||||
0.1f
|
||||
);
|
||||
-> at com.example.service.base.MessageEntryFilter.classifyMessage(MessageEntryFilter.java:99)
|
||||
|
||||
|
||||
at com.example.service.base.GeminiClientService.generateContent(GeminiClientService.java:36)
|
||||
at com.example.service.unit_testing.MessageEntryFilterTest.classifyMessage_shouldIncludeNotificationContextInPrompt(MessageEntryFilterTest.java:222)
|
||||
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
|
||||
at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
|
||||
at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
|
||||
|
||||
com.example.service.unit_testing.MessageEntryFilterTest.classifyMessage_shouldReturnConversation_whenGeminiRespondsConversation -- Time elapsed: 0.005 s <<< FAILURE!
|
||||
org.opentest4j.AssertionFailedError: Log message for successful classification not found. ==> expected: not <null>
|
||||
at org.junit.jupiter.api.AssertionFailureBuilder.build(AssertionFailureBuilder.java:152)
|
||||
at org.junit.jupiter.api.AssertionFailureBuilder.buildAndThrow(AssertionFailureBuilder.java:132)
|
||||
at org.junit.jupiter.api.AssertNotNull.failNull(AssertNotNull.java:49)
|
||||
at org.junit.jupiter.api.AssertNotNull.assertNotNull(AssertNotNull.java:35)
|
||||
at org.junit.jupiter.api.Assertions.assertNotNull(Assertions.java:312)
|
||||
at com.example.service.unit_testing.MessageEntryFilterTest.classifyMessage_shouldReturnConversation_whenGeminiRespondsConversation(MessageEntryFilterTest.java:116)
|
||||
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
|
||||
at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
|
||||
at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
|
||||
|
||||
com.example.service.unit_testing.MessageEntryFilterTest.classifyMessage_shouldNotIncludeNotificationContextInPromptWhenNull -- Time elapsed: 0.007 s <<< FAILURE!
|
||||
Wanted but not invoked:
|
||||
geminiService.generateContent(
|
||||
<custom argument matcher>,
|
||||
<any float>,
|
||||
<any integer>,
|
||||
<any java.lang.String>,
|
||||
<any float>
|
||||
);
|
||||
-> at com.example.service.base.GeminiClientService.generateContent(GeminiClientService.java:36)
|
||||
|
||||
However, there was exactly 1 interaction with this mock:
|
||||
geminiService.generateContent(
|
||||
"Hay un sistema de conversaciones entre un agente y un usuario. Durante
|
||||
la conversación, una notificación puede entrar a la conversación de forma
|
||||
abrupta, de tal forma que la siguiente interacción del usuario después
|
||||
de la notificación puede corresponder a la conversación que estaba
|
||||
sucediendo o puede ser un seguimiento a la notificación.
|
||||
|
||||
Tu tarea es identificar si la siguiente interacción del usuario es un
|
||||
seguimiento a la notificación o una continuación de la conversación.
|
||||
|
||||
Recibirás esta información:
|
||||
|
||||
- HISTORIAL_CONVERSACION: El diálogo entre el agente y el usuario antes
|
||||
de la notificación.
|
||||
- INTERRUPCION_NOTIFICACION: La notificación. Esta puede o no traer parámetros
|
||||
los cuales refieren a detalles específicos de la notificación. Por ejemplo:
|
||||
{ "vigencia": “12 de septiembre de 2025”, "credito_tipo" : "platinum" }
|
||||
- INTERACCION_USUARIO: La siguiente interacción del usuario después de
|
||||
la notificación.
|
||||
|
||||
Reglas:
|
||||
- Solo debes responder una palabra: NOTIFICATION o CONVERSATION. No agregues
|
||||
o inventes otra palabra.
|
||||
- Clasifica como NOTIFICATION si la siguiente interacción del usuario
|
||||
es una clara respuesta o seguimiento a la notificación.
|
||||
- Clasifica como CONVERSATION si la siguiente interacción del usuario
|
||||
es un claro seguimiento al histórico de la conversación.
|
||||
- Si la siguiente interacción del usuario es ambigua, clasifica
|
||||
como CONVERSATION.
|
||||
|
||||
Ejemplos:
|
||||
|
||||
Ejemplo 1:
|
||||
HISTORIAL_CONVERSACION:
|
||||
Agente: Claro, para un crédito de vehículo, las tasas actuales inician en el 1.2% mensual.
|
||||
Usuario: Entiendo, ¿y el plazo máximo de cuánto sería?
|
||||
INTERRUPCION_NOTIFICACION:
|
||||
Tu pago de la tarjeta de crédito por $1,500.00 ha sido procesado.
|
||||
INTERACCION_USUARIO:
|
||||
perfecto, cuando es la fecha de corte?
|
||||
Clasificación: NOTIFICACION
|
||||
|
||||
Ejemplo 2:
|
||||
HISTORIAL_CONVERSACION:
|
||||
Agente: No es necesario, puedes completar todo el proceso para abrir tu cuenta desde nuestra app.
|
||||
Usuario: Ok
|
||||
Agente: ¿Necesitas algo más?
|
||||
INTERRUPCION_NOTIFICACION:
|
||||
Tu estado de cuenta de Julio ya está disponible.
|
||||
Parametros: {"fecha_corte": "30 de Agosto del 2025", "tipo_cuenta": "credito"}
|
||||
INTERACCION_USUARIO:
|
||||
que documentos necesito?
|
||||
Clasificación: CONVERSACION
|
||||
|
||||
Ejemplo 3:
|
||||
HISTORIAL_CONVERSACION:
|
||||
Agente: Ese fondo de inversión tiene un perfil de alto riesgo, pero históricamente ha dado un rendimiento superior al 15% anual.
|
||||
Usuario: ok, entiendo
|
||||
INTERRUPCION_NOTIFICACION:
|
||||
Alerta: Tu cuenta de ahorros tiene un saldo bajo de $50.00.
|
||||
Parametros: {"fecha_retiro": "5 de septiembre del 2025", "tipo_cuenta": "ahorros"}
|
||||
INTERACCION_USUARIO:
|
||||
cuando fue el ultimo retiro?
|
||||
Clasificación: NOTIFICACION
|
||||
|
||||
Ejemplo 4:
|
||||
HISTORIAL_CONVERSACION:
|
||||
Usuario: Que es el CAT?
|
||||
Agente: El CAT (Costo Anual Total) es un indicador financiero, expresado en un porcentaje anual, que refleja el costo total de un crédito, incluyendo no solo la tasa de interés, sino también todas las comisiones, gastos y otros cobros que genera.
|
||||
INTERRUPCION_NOTIFICACION:
|
||||
Alerta: Se realizó un retiro en efectivo por $100.
|
||||
INTERACCION_USUARIO:
|
||||
y este se aplica solo si dejo de pagar?
|
||||
Clasificación: CONVERSACION
|
||||
|
||||
Ejemplo 5:
|
||||
HISTORIAL_CONVERSACION:
|
||||
Usuario: Cual es la tasa de hipoteca que manejan?
|
||||
Agente: La tasa de una hipoteca depende tanto de factores económicos generales (inflación, tasas de referencia del banco central) como de factores individuales del solicitante (historial crediticio, monto del pago inicial, ingresos, endeudamiento, etc.)
|
||||
INTERRUPCION_NOTIFICACION:
|
||||
Hola, [Alias]: Pasó algo con la captura de tu INE y no se completó tu solicitud de tarjeta de crédito con folio 3421.
|
||||
Parametros: {“solicitud_tarjeta_credito_vigencia”: “12 de septiembre de 2025”, “solicitud_tarjeta_credito_error”: “Error con el formato de la captura”, “solicitud_tarjeta_credito_tipo” : “platinum” }
|
||||
INTERACCION_USUARIO:
|
||||
cual fue el error?
|
||||
Clasificación: NOTIFICACION
|
||||
|
||||
Tarea:
|
||||
HISTORIAL_CONVERSACION:
|
||||
No conversation history.
|
||||
INTERRUPCION_NOTIFICACION:
|
||||
No interrupting notification.
|
||||
INTERACCION_USUARIO:
|
||||
What's up?
|
||||
Clasificación:
|
||||
",
|
||||
0.1f,
|
||||
10,
|
||||
"gemini-2.0-flash-001",
|
||||
0.1f
|
||||
);
|
||||
-> at com.example.service.base.MessageEntryFilter.classifyMessage(MessageEntryFilter.java:99)
|
||||
|
||||
|
||||
at com.example.service.base.GeminiClientService.generateContent(GeminiClientService.java:36)
|
||||
at com.example.service.unit_testing.MessageEntryFilterTest.classifyMessage_shouldNotIncludeNotificationContextInPromptWhenNull(MessageEntryFilterTest.java:267)
|
||||
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
|
||||
at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
|
||||
at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
|
||||
|
||||
@@ -0,0 +1,132 @@
|
||||
-------------------------------------------------------------------------------
|
||||
Test set: com.example.service.unit_testing.QuickRepliesManagerServiceTest
|
||||
-------------------------------------------------------------------------------
|
||||
Tests run: 3, Failures: 2, Errors: 0, Skipped: 0, Time elapsed: 0.290 s <<< FAILURE! -- in com.example.service.unit_testing.QuickRepliesManagerServiceTest
|
||||
com.example.service.unit_testing.QuickRepliesManagerServiceTest.manageConversation_Count0_Match_ShouldAnswer -- Time elapsed: 0.245 s <<< FAILURE!
|
||||
java.lang.AssertionError:
|
||||
expectation failed (failed running expectation on signal [onNext(DetectIntentResponseDTO[responseId=session-123, queryResult=null, quickReplies=QuickReplyDTO[header=Header, body=Body, button=Btn, headerSection=Section, preguntas=[QuestionDTO[titulo=Ver Saldo, descripcion=desc, respuesta=Tu saldo es 100 pesos]]]])] with [java.lang.NullPointerException]:
|
||||
Cannot invoke "com.example.dto.dialogflow.conversation.QueryResultDTO.responseText()" because the return value of "com.example.dto.dialogflow.base.DetectIntentResponseDTO.queryResult()" is null)
|
||||
at reactor.test.MessageFormatter.assertionError(MessageFormatter.java:115)
|
||||
at reactor.test.MessageFormatter.failPrefix(MessageFormatter.java:104)
|
||||
at reactor.test.MessageFormatter.fail(MessageFormatter.java:73)
|
||||
at reactor.test.MessageFormatter.failOptional(MessageFormatter.java:88)
|
||||
at reactor.test.DefaultStepVerifierBuilder$DefaultVerifySubscriber.onExpectation(DefaultStepVerifierBuilder.java:1511)
|
||||
at reactor.test.DefaultStepVerifierBuilder$DefaultVerifySubscriber.onNext(DefaultStepVerifierBuilder.java:1146)
|
||||
at reactor.core.publisher.MonoFlatMap$FlatMapMain.secondComplete(MonoFlatMap.java:245)
|
||||
at reactor.core.publisher.MonoFlatMap$FlatMapInner.onNext(MonoFlatMap.java:305)
|
||||
at reactor.core.publisher.MonoFlatMap$FlatMapMain.secondComplete(MonoFlatMap.java:245)
|
||||
at reactor.core.publisher.MonoFlatMap$FlatMapInner.onNext(MonoFlatMap.java:305)
|
||||
at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.complete(MonoIgnoreThen.java:294)
|
||||
at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.onNext(MonoIgnoreThen.java:188)
|
||||
at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.subscribeNext(MonoIgnoreThen.java:237)
|
||||
at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.onComplete(MonoIgnoreThen.java:204)
|
||||
at reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.onComplete(MonoPeekTerminal.java:299)
|
||||
at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.onComplete(MonoIgnoreThen.java:210)
|
||||
at reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.onComplete(MonoPeekTerminal.java:299)
|
||||
at reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.onComplete(MonoPeekTerminal.java:299)
|
||||
at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.onComplete(MonoIgnoreThen.java:210)
|
||||
at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.subscribeNext(MonoIgnoreThen.java:239)
|
||||
at reactor.core.publisher.MonoIgnoreThen.subscribe(MonoIgnoreThen.java:51)
|
||||
at reactor.core.publisher.InternalMonoOperator.subscribe(InternalMonoOperator.java:76)
|
||||
at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.subscribeNext(MonoIgnoreThen.java:241)
|
||||
at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.onComplete(MonoIgnoreThen.java:204)
|
||||
at reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.onComplete(MonoPeekTerminal.java:299)
|
||||
at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.onComplete(MonoIgnoreThen.java:210)
|
||||
at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.subscribeNext(MonoIgnoreThen.java:239)
|
||||
at reactor.core.publisher.MonoIgnoreThen.subscribe(MonoIgnoreThen.java:51)
|
||||
at reactor.core.publisher.Mono.subscribe(Mono.java:4576)
|
||||
at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.subscribeNext(MonoIgnoreThen.java:265)
|
||||
at reactor.core.publisher.MonoIgnoreThen.subscribe(MonoIgnoreThen.java:51)
|
||||
at reactor.core.publisher.Mono.subscribe(Mono.java:4576)
|
||||
at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.subscribeNext(MonoIgnoreThen.java:265)
|
||||
at reactor.core.publisher.MonoIgnoreThen.subscribe(MonoIgnoreThen.java:51)
|
||||
at reactor.core.publisher.MonoFlatMap$FlatMapMain.onNext(MonoFlatMap.java:165)
|
||||
at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.complete(MonoIgnoreThen.java:294)
|
||||
at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.onNext(MonoIgnoreThen.java:188)
|
||||
at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.subscribeNext(MonoIgnoreThen.java:237)
|
||||
at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.onComplete(MonoIgnoreThen.java:204)
|
||||
at reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.onComplete(MonoPeekTerminal.java:299)
|
||||
at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.onComplete(MonoIgnoreThen.java:210)
|
||||
at reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.onComplete(MonoPeekTerminal.java:299)
|
||||
at reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.onComplete(MonoPeekTerminal.java:299)
|
||||
at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.onComplete(MonoIgnoreThen.java:210)
|
||||
at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.subscribeNext(MonoIgnoreThen.java:239)
|
||||
at reactor.core.publisher.MonoIgnoreThen.subscribe(MonoIgnoreThen.java:51)
|
||||
at reactor.core.publisher.InternalMonoOperator.subscribe(InternalMonoOperator.java:76)
|
||||
at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.subscribeNext(MonoIgnoreThen.java:241)
|
||||
at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.onComplete(MonoIgnoreThen.java:204)
|
||||
at reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.onComplete(MonoPeekTerminal.java:299)
|
||||
at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.onComplete(MonoIgnoreThen.java:210)
|
||||
at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.subscribeNext(MonoIgnoreThen.java:239)
|
||||
at reactor.core.publisher.MonoIgnoreThen.subscribe(MonoIgnoreThen.java:51)
|
||||
at reactor.core.publisher.Mono.subscribe(Mono.java:4576)
|
||||
at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.subscribeNext(MonoIgnoreThen.java:265)
|
||||
at reactor.core.publisher.MonoIgnoreThen.subscribe(MonoIgnoreThen.java:51)
|
||||
at reactor.core.publisher.Mono.subscribe(Mono.java:4576)
|
||||
at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.subscribeNext(MonoIgnoreThen.java:265)
|
||||
at reactor.core.publisher.MonoIgnoreThen.subscribe(MonoIgnoreThen.java:51)
|
||||
at reactor.core.publisher.Mono.subscribe(Mono.java:4576)
|
||||
at reactor.core.publisher.FluxFlatMap.trySubscribeScalarMap(FluxFlatMap.java:202)
|
||||
at reactor.core.publisher.MonoFlatMap.subscribeOrReturn(MonoFlatMap.java:53)
|
||||
at reactor.core.publisher.InternalMonoOperator.subscribe(InternalMonoOperator.java:63)
|
||||
at reactor.core.publisher.MonoFlatMap$FlatMapMain.onNext(MonoFlatMap.java:165)
|
||||
at reactor.core.publisher.FluxSwitchIfEmpty$SwitchIfEmptySubscriber.onNext(FluxSwitchIfEmpty.java:74)
|
||||
at reactor.core.publisher.Operators$ScalarSubscription.request(Operators.java:2570)
|
||||
at reactor.core.publisher.Operators$MultiSubscriptionSubscriber.set(Operators.java:2366)
|
||||
at reactor.core.publisher.Operators$MultiSubscriptionSubscriber.onSubscribe(Operators.java:2240)
|
||||
at reactor.core.publisher.MonoJust.subscribe(MonoJust.java:55)
|
||||
at reactor.core.publisher.Mono.subscribe(Mono.java:4576)
|
||||
at reactor.test.DefaultStepVerifierBuilder$DefaultStepVerifier.toVerifierAndSubscribe(DefaultStepVerifierBuilder.java:891)
|
||||
at reactor.test.DefaultStepVerifierBuilder$DefaultStepVerifier.verify(DefaultStepVerifierBuilder.java:831)
|
||||
at reactor.test.DefaultStepVerifierBuilder$DefaultStepVerifier.verify(DefaultStepVerifierBuilder.java:823)
|
||||
at reactor.test.DefaultStepVerifierBuilder.verifyComplete(DefaultStepVerifierBuilder.java:690)
|
||||
at com.example.service.unit_testing.QuickRepliesManagerServiceTest.manageConversation_Count0_Match_ShouldAnswer(QuickRepliesManagerServiceTest.java:123)
|
||||
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
|
||||
at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
|
||||
at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
|
||||
Suppressed: java.lang.NullPointerException: Cannot invoke "com.example.dto.dialogflow.conversation.QueryResultDTO.responseText()" because the return value of "com.example.dto.dialogflow.base.DetectIntentResponseDTO.queryResult()" is null
|
||||
at com.example.service.unit_testing.QuickRepliesManagerServiceTest.lambda$manageConversation_Count0_Match_ShouldAnswer$1(QuickRepliesManagerServiceTest.java:121)
|
||||
at reactor.test.DefaultStepVerifierBuilder.lambda$consumeNextWith$1(DefaultStepVerifierBuilder.java:279)
|
||||
at reactor.test.DefaultStepVerifierBuilder$SignalEvent.test(DefaultStepVerifierBuilder.java:2289)
|
||||
at reactor.test.DefaultStepVerifierBuilder$DefaultVerifySubscriber.onSignal(DefaultStepVerifierBuilder.java:1529)
|
||||
at reactor.test.DefaultStepVerifierBuilder$DefaultVerifySubscriber.onExpectation(DefaultStepVerifierBuilder.java:1477)
|
||||
... 73 more
|
||||
|
||||
com.example.service.unit_testing.QuickRepliesManagerServiceTest.manageConversation_Count0_NoMatch_ShouldDelegate -- Time elapsed: 0.007 s <<< FAILURE!
|
||||
java.lang.AssertionError: expectation "expectNext(DetectIntentResponseDTO[responseId=df-response, queryResult=QueryResultDTO[responseText=Hola soy Beto, parameters=null], quickReplies=null])" failed (expected: onNext(DetectIntentResponseDTO[responseId=df-response, queryResult=QueryResultDTO[responseText=Hola soy Beto, parameters=null], quickReplies=null]); actual: onError(java.lang.NullPointerException: Cannot invoke "com.example.dto.dialogflow.conversation.ConversationMessageDTO.text()" because "message" is null))
|
||||
at reactor.test.MessageFormatter.assertionError(MessageFormatter.java:115)
|
||||
at reactor.test.MessageFormatter.failPrefix(MessageFormatter.java:104)
|
||||
at reactor.test.MessageFormatter.fail(MessageFormatter.java:73)
|
||||
at reactor.test.MessageFormatter.failOptional(MessageFormatter.java:88)
|
||||
at reactor.test.DefaultStepVerifierBuilder.lambda$addExpectedValue$10(DefaultStepVerifierBuilder.java:509)
|
||||
at reactor.test.DefaultStepVerifierBuilder$SignalEvent.test(DefaultStepVerifierBuilder.java:2289)
|
||||
at reactor.test.DefaultStepVerifierBuilder$DefaultVerifySubscriber.onSignal(DefaultStepVerifierBuilder.java:1529)
|
||||
at reactor.test.DefaultStepVerifierBuilder$DefaultVerifySubscriber.onExpectation(DefaultStepVerifierBuilder.java:1477)
|
||||
at reactor.test.DefaultStepVerifierBuilder$DefaultVerifySubscriber.onError(DefaultStepVerifierBuilder.java:1129)
|
||||
at reactor.core.publisher.MonoFlatMap$FlatMapMain.secondError(MonoFlatMap.java:241)
|
||||
at reactor.core.publisher.MonoFlatMap$FlatMapInner.onError(MonoFlatMap.java:315)
|
||||
at reactor.core.publisher.Operators.error(Operators.java:198)
|
||||
at reactor.core.publisher.FluxFlatMap.trySubscribeScalarMap(FluxFlatMap.java:162)
|
||||
at reactor.core.publisher.MonoFlatMap.subscribeOrReturn(MonoFlatMap.java:53)
|
||||
at reactor.core.publisher.InternalMonoOperator.subscribe(InternalMonoOperator.java:63)
|
||||
at reactor.core.publisher.MonoFlatMap$FlatMapMain.onNext(MonoFlatMap.java:165)
|
||||
at reactor.core.publisher.FluxSwitchIfEmpty$SwitchIfEmptySubscriber.onNext(FluxSwitchIfEmpty.java:74)
|
||||
at reactor.core.publisher.Operators$ScalarSubscription.request(Operators.java:2570)
|
||||
at reactor.core.publisher.Operators$MultiSubscriptionSubscriber.set(Operators.java:2366)
|
||||
at reactor.core.publisher.Operators$MultiSubscriptionSubscriber.onSubscribe(Operators.java:2240)
|
||||
at reactor.core.publisher.MonoJust.subscribe(MonoJust.java:55)
|
||||
at reactor.core.publisher.Mono.subscribe(Mono.java:4576)
|
||||
at reactor.test.DefaultStepVerifierBuilder$DefaultStepVerifier.toVerifierAndSubscribe(DefaultStepVerifierBuilder.java:891)
|
||||
at reactor.test.DefaultStepVerifierBuilder$DefaultStepVerifier.verify(DefaultStepVerifierBuilder.java:831)
|
||||
at reactor.test.DefaultStepVerifierBuilder$DefaultStepVerifier.verify(DefaultStepVerifierBuilder.java:823)
|
||||
at reactor.test.DefaultStepVerifierBuilder.verifyComplete(DefaultStepVerifierBuilder.java:690)
|
||||
at com.example.service.unit_testing.QuickRepliesManagerServiceTest.manageConversation_Count0_NoMatch_ShouldDelegate(QuickRepliesManagerServiceTest.java:86)
|
||||
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
|
||||
at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
|
||||
at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
|
||||
Suppressed: java.lang.NullPointerException: Cannot invoke "com.example.dto.dialogflow.conversation.ConversationMessageDTO.text()" because "message" is null
|
||||
at com.example.service.quickreplies.QuickRepliesManagerService.persistConversationTurn(QuickRepliesManagerService.java:164)
|
||||
at com.example.service.quickreplies.QuickRepliesManagerService.lambda$5(QuickRepliesManagerService.java:114)
|
||||
at reactor.core.publisher.FluxFlatMap.trySubscribeScalarMap(FluxFlatMap.java:153)
|
||||
... 17 more
|
||||
|
||||
@@ -0,0 +1,34 @@
|
||||
-------------------------------------------------------------------------------
|
||||
Test set: com.example.service.unit_testing.QuickReplyContentServiceTest
|
||||
-------------------------------------------------------------------------------
|
||||
Tests run: 3, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 0.583 s <<< FAILURE! -- in com.example.service.unit_testing.QuickReplyContentServiceTest
|
||||
com.example.service.unit_testing.QuickReplyContentServiceTest.getQuickReplies_success -- Time elapsed: 0.122 s <<< ERROR!
|
||||
org.mockito.exceptions.misusing.InvalidUseOfMatchersException:
|
||||
|
||||
Misplaced or misused argument matcher detected here:
|
||||
|
||||
-> at com.example.service.unit_testing.GeminiClientServiceTest.generateContent_whenApiResponseIsNull_throwsGeminiClientException(GeminiClientServiceTest .java:72)
|
||||
-> at com.example.service.unit_testing.GeminiClientServiceTest.generateContent_whenApiResponseIsNull_throwsGeminiClientException(GeminiClientServiceTest .java:72)
|
||||
-> at com.example.service.unit_testing.GeminiClientServiceTest.generateContent_whenApiResponseIsNull_throwsGeminiClientException(GeminiClientServiceTest .java:72)
|
||||
|
||||
You cannot use argument matchers outside of verification or stubbing.
|
||||
Examples of correct usage of argument matchers:
|
||||
when(mock.get(anyInt())).thenReturn(null);
|
||||
doThrow(new RuntimeException()).when(mock).someVoidMethod(any());
|
||||
verify(mock).someMethod(contains("foo"))
|
||||
|
||||
This message may appear after an NullPointerException if the last matcher is returning an object
|
||||
like any() but the stubbed method signature expect a primitive argument, in this case,
|
||||
use primitive alternatives.
|
||||
when(mock.get(any())); // bad use, will raise NPE
|
||||
when(mock.get(anyInt())); // correct usage use
|
||||
|
||||
Also, this error might show up because you use argument matchers with methods that cannot be mocked.
|
||||
Following methods *cannot* be stubbed/verified: final/private/equals()/hashCode().
|
||||
Mocking methods declared on non-public parent classes is not supported.
|
||||
|
||||
at com.example.service.unit_testing.QuickReplyContentServiceTest.setUp(QuickReplyContentServiceTest.java:49)
|
||||
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
|
||||
at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
|
||||
at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
-------------------------------------------------------------------------------
|
||||
Test set: com.example.service.unit_testing.RagClientServiceTest
|
||||
-------------------------------------------------------------------------------
|
||||
Tests run: 7, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.849 s -- in com.example.service.unit_testing.RagClientServiceTest
|
||||
Reference in New Issue
Block a user