Writing unit test for Azure Service Bus Java SDK Queue listener

23 views Asked by At

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?

0

There are 0 answers