I am writing unit tests for my Azure service bus queue listener. I am using Java Quarkus.
I've set up my listener while following the Microsoft guide. Below is my listener implementation:
@ApplicationScoped
public class ConversionResultsListener {
@Inject
@Named("ConversionResultsListener")
ServiceBusProcessorClientBuilder serviceBusProcessorClientBuilder;
@Inject
HandleConversionResult handleConversionResult;
@Inject
ObjectMapper objectMapper;
private ServiceBusProcessorClient serviceBusProcessorClient;
public void start(@Observes StartupEvent event) {
serviceBusProcessorClient =
serviceBusProcessorClientBuilder
.processMessage(processMessage)
.processError(processError)
.buildProcessorClient();
serviceBusProcessorClient.start();
}
public void stop(@Observes ShutdownEvent event) {
serviceBusProcessorClient.stop();
serviceBusProcessorClient.close();
}
Consumer<ServiceBusReceivedMessageContext> processMessage = context -> {
final byte[] message = context.getMessage().getBody().toBytes();
try {
ConversionResultEvent conversionResultEvent =
objectMapper.readValue(message, ConversionResultEvent.class);
handleConversionResult.handle(conversionResultEvent);
} catch (IOException e) {
Log.error("Unable to process result from Service Bus Queue.", e);
}
};
Consumer<ServiceBusErrorContext> processError = errorContext ->
Log.error(
"Unable to process result from Service Bus Queue.",
errorContext.getException()
);
}
The serviceBusProcessorClientBuilder gets produced in a separate method.
Now I've set up my test using Quarkus Test.
@QuarkusTest
public class ConversionResultsListenerTest {
@InjectMock
@MockitoConfig(convertScopes = true)
@Named("ConversionResultsListener")
ServiceBusProcessorClientBuilder serviceBusProcessorClientBuilder;
@InjectMock
HandleConversionResult handleConversionResult;
@InjectMock
@MockitoConfig(convertScopes = true)
ObjectMapper objectMapper;
@Inject
ConversionResultsListener conversionResultsListener;
private ServiceBusProcessorClient serviceBusProcessorClient;
@BeforeEach
void setup() {
serviceBusProcessorClient = mock(ServiceBusProcessorClient.class);
when(serviceBusProcessorClientBuilder.buildProcessorClient()).thenReturn(serviceBusProcessorClient);
}
@Test
void conversionResultsListenerTest_TestStart() {
conversionResultsListener.start(mock(StartupEvent.class));
verify(serviceBusProcessorClientBuilder).buildProcessorClient();
verify(serviceBusProcessorClient).start();
}
}
But for some reason, I am getting an error stating: 'Failed to start Quarkus. Caused by: java.lang.NoSuchMethodError: com.azure.messaging.servicebus.ServiceBusClientBuilder$ServiceBusProcessorClientBuilder: method 'void ()' not found at com.azure.messaging.servicebus.ClientProducers_ProducerMethod_conversionResultsListener_HUyKfWMhqEEOMrZb7GRpnClu_QA_ClientProxy.(Unknown Source)'.
I am using the same kind of producer method for sending messages, and that works fine. I've removed them for this SO post.
@ApplicationScoped
public class ClientProducers {
@Inject
ServiceBusClient serviceBusClient;
@Singleton
@Produces
@Named("ConversionResultsListener")
public ServiceBusProcessorClientBuilder conversionResultsListener() {
return serviceBusClient.queueListener("ConversionResultsQueue");
}
}
Does anyone have an idea what I'm doing wrong here?