WireMock.Grpc.Protobuf
1.2.0
dotnet add package WireMock.Grpc.Protobuf --version 1.2.0
NuGet\Install-Package WireMock.Grpc.Protobuf -Version 1.2.0
<PackageReference Include="WireMock.Grpc.Protobuf" Version="1.2.0" />
<PackageVersion Include="WireMock.Grpc.Protobuf" Version="1.2.0" />
<PackageReference Include="WireMock.Grpc.Protobuf" />
paket add WireMock.Grpc.Protobuf --version 1.2.0
#r "nuget: WireMock.Grpc.Protobuf, 1.2.0"
#:package WireMock.Grpc.Protobuf@1.2.0
#addin nuget:?package=WireMock.Grpc.Protobuf&version=1.2.0
#tool nuget:?package=WireMock.Grpc.Protobuf&version=1.2.0
WireMock.Net.Google.Protobuf
Link to NuGet: https://www.nuget.org/packages/WireMock.Grpc.Protobuf
Statically typed gRPC mocking for WireMock.Net using generated Google.Protobuf contracts.
Request.Create()
.WithBodyAsGoogleProtobuf(new HelloRequest { Name = "Stepan" });
Response.Create()
.WithBodyAsGoogleProtobuf(
new HelloReply { Message = "Hello, Stepan!" });
No ProtoDefinition, message type strings, JSON conversion, or manually constructed binary payloads.
Why?
The standard WireMock.Net protobuf integration requires loading .proto definitions and referring to protobuf message types separately from your generated C# contracts.
This package uses the generated IMessage<T> types you already have to write less configuration and do no duplicated schema setup:
- compile-time type safety;
- native
Google.Protobufserialization; - exact-message and predicate request matching;
When a contract changes, outdated mocks stop compiling instead of failing at runtime.
Installation
dotnet add package WireMock.Grpc.Protobuf
The package targets .NET Standard 2.0 and .NET 8.
Message Matching
Assuming you have some greet.proto file that generates HelloRequest, HelloReply, and Greeter.GreeterClient for instance:
syntax = "proto3";
option csharp_namespace = "Greeting.Contracts";
package greet;
service Greeter {
rpc SayHello (HelloRequest) returns (HelloReply);
}
message HelloRequest {
string name = 1;
}
message HelloReply {
string message = 1;
}
And assuming you also have the required packages added with protobuf compilation settings to your test project:
<Project Sdk="Microsoft.NET.Sdk">
<ItemGroup>
<PackageReference Include="WireMock.Net" Version="2.13.0" />
<PackageReference Include="WireMock.Grpc.Protobuf" Version="1.0.0" />
<PackageReference Include="Grpc.Net.Client" Version="2.80.0" />
<PackageReference Include="Grpc.Core" Version="2.46.6"/>
<PackageReference Include="Grpc.Tools" Version="2.82.0">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
</ItemGroup>
<ItemGroup>
<Protobuf Include=".\test.proto" GrpcServices="Client" />
</ItemGroup>
</Project>
Start WireMock.Net with HTTP/2 enabled and configure the expected request and response using the WithBodyAsGoogleProtobuf extension methods:
using Greeting.Contracts;
using Grpc.Net.Client;
using WireMock.Net.Google.Protobuf.Request;
using WireMock.Net.Google.Protobuf.Response;
using WireMock.RequestBuilders;
using WireMock.ResponseBuilders;
using WireMock.Server;
using WireMock.Settings;
using var server = WireMockServer.Start(
new WireMockServerSettings
{
UseHttp2 = true
});
var request = new HelloRequest
{
Name = "Stepan"
};
var expectedResponse = new HelloReply
{
Message = "Hello, Stepan!"
};
server
.Given(
Request.Create()
.UsingPost()
.WithHttpVersion("2")
.WithPath("/greet.Greeter/SayHello")
.WithBodyAsGoogleProtobuf(request))
.RespondWith(
Response.Create()
.WithHeader("Content-Type", "application/grpc")
.WithTrailingHeader("grpc-status", "0")
.WithBodyAsGoogleProtobuf(expectedResponse));
using var channel = GrpcChannel.ForAddress(server.Url!);
var client = new Greeter.GreeterClient(channel);
var actualResponse = await client.SayHelloAsync(request);
Assert.Equal(expectedResponse, actualResponse);
Predicate Matching
Match only the fields relevant to your test:
Request.Create()
.WithBodyAsGoogleProtobuf<HelloRequest>(
request =>
request.Name.StartsWith("Step") &&
request.Name.Length >= 5);
This keeps request matching strongly typed without comparing the entire protobuf message.
Important
Do not call WithTransformer() after WithBodyAsGoogleProtobuf(). The response is already a binary gRPC frame, and text transformation may corrupt it.
WireMock.Net must also run with HTTP/2 enabled:
new WireMockServerSettings
{
UseHttp2 = true
};
License
Distributed under the MIT License.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
| .NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
| .NET Standard | netstandard2.0 is compatible. netstandard2.1 was computed. |
| .NET Framework | net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
| MonoAndroid | monoandroid was computed. |
| MonoMac | monomac was computed. |
| MonoTouch | monotouch was computed. |
| Tizen | tizen40 was computed. tizen60 was computed. |
| Xamarin.iOS | xamarinios was computed. |
| Xamarin.Mac | xamarinmac was computed. |
| Xamarin.TVOS | xamarintvos was computed. |
| Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETStandard 2.0
- Google.Protobuf (>= 3.36.1)
- WireMock.Net.Minimal (>= 2.15.0)
-
net8.0
- Google.Protobuf (>= 3.36.1)
- WireMock.Net.Minimal (>= 2.15.0)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.