Skip to content

Azure Service Bus

Azure Service Bus emulator⁠ is designed to offer a local development experience for Azure Service Bus⁠, enabling you to develop and test code against the service in isolation, free from cloud interference.

Add the following dependency to your project file:

NuGet
1
dotnet add package Testcontainers.ServiceBus

You can start an Azure Service Bus container instance from any .NET application. Here, we create different container instances and pass them to the base test class. This allows us to test different configurations.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
[UsedImplicitly]
public sealed class ServiceBusDefaultMsSqlConfiguration : ServiceBusContainerTest
{
    public ServiceBusDefaultMsSqlConfiguration()
        : base(new ServiceBusBuilder()
            .WithAcceptLicenseAgreement(true)
            .Build())
    {
    }
}

This example uses xUnit.net's IAsyncLifetime interface to manage the lifecycle of the container. The container is started in the InitializeAsync method before the test method runs, ensuring that the environment is ready for testing. After the test completes, the container is removed in the DisposeAsync method.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
public Task InitializeAsync()
{
    return _serviceBusContainer.StartAsync();
}

public Task DisposeAsync()
{
    return _serviceBusContainer.DisposeAsync().AsTask();
}

[Fact]
[Trait(nameof(DockerCli.DockerPlatform), nameof(DockerCli.DockerPlatform.Linux))]
public async Task ReceiveMessageReturnsSentMessage()
{
    // Given
    const string helloServiceBus = "Hello, Service Bus!";

    // By default, the emulator uses the following configuration:
    // https://learn.microsoft.com/en-us/azure/service-bus-messaging/test-locally-with-service-bus-emulator?tabs=automated-script#interact-with-the-emulator.

    // Upload a custom configuration before the container starts using the
    // `WithResourceMapping(string, string)` API or one of its overloads:
    // `WithResourceMapping("Config.json", "/ServiceBus_Emulator/ConfigFiles/")`.
    const string queueName = "queue.1";

    var message = new ServiceBusMessage(helloServiceBus);

    await using var client = new ServiceBusClient(_serviceBusContainer.GetConnectionString());

    var sender = client.CreateSender(queueName);

    var receiver = client.CreateReceiver(queueName);

    // When
    await sender.SendMessageAsync(message)
        .ConfigureAwait(true);

    var receivedMessage = await receiver.ReceiveMessageAsync()
        .ConfigureAwait(true);

    // Then
    Assert.Equal(helloServiceBus, receivedMessage.Body.ToString());
}

The test example uses the following NuGet dependencies:

1
2
3
4
5
<PackageReference Include="Microsoft.NET.Test.Sdk"/>
<PackageReference Include="coverlet.collector"/>
<PackageReference Include="xunit.runner.visualstudio"/>
<PackageReference Include="xunit"/>
<PackageReference Include="Azure.Messaging.ServiceBus"/>

To execute the tests, use the command dotnet test from a terminal.

Tip

For the complete source code of this example and additional information, please refer to our test projects.

Use a custom MSSQL instance

The Service Bus module depends on an MSSQL container instance. The module automatically creates and configures the necessary resources and connects them. If you prefer to use your own instance, you can use the following method to configure the builder accordingly:

1
.WithMsSqlContainer(fixture.Network, fixture.Container, DatabaseFixture.DatabaseNetworkAlias)