Kotlin grpc mock server


License

License

GroupId

GroupId

io.github.udarya
ArtifactId

ArtifactId

mock-server
Last Version

Last Version

0.2
Release Date

Release Date

Type

Type

pom.sha512
Description

Description

Kotlin grpc mock server
Kotlin grpc mock server
Project URL

Project URL

https://github.com/UDarya/grpc-mock-server
Project Organization

Project Organization

io.github.udarya
Source Code Management

Source Code Management

https://github.com/UDarya/grpc-mock-server

Download mock-server

Dependencies

compile (5)

Group / Artifact Type Version
javax.annotation : javax.annotation-api jar 1.3.2
io.grpc : grpc-kotlin-stub jar 0.1.1
io.grpc : grpc-protobuf jar 1.28.1
io.grpc : grpc-stub jar 1.28.1
org.jetbrains.kotlin : kotlin-stdlib jar 1.4.0

runtime (13)

Group / Artifact Type Version
com.google.protobuf : protobuf-java jar 3.9.1
com.google.protobuf : protobuf-java-util jar 3.9.1
org.jetbrains.kotlin : kotlin-reflect jar 1.4.21
org.jetbrains.kotlinx : kotlinx-coroutines-core-jvm jar 1.4.3
com.squareup : kotlinpoet jar 1.7.2
org.jetbrains.kotlin : kotlin-compiler-embeddable jar 1.4.21
org.jetbrains.kotlin : kotlin-script-runtime jar 1.4.21
org.jetbrains.kotlin : kotlin-script-util jar 1.4.21
org.jetbrains.kotlin : kotlin-scripting-jsr223 jar 1.4.21
net.java.dev.jna : jna jar 5.7.0
io.grpc : grpc-netty jar 1.28.1
org.skyscreamer : jsonassert jar 1.5.0
com.fasterxml.jackson.core : jackson-databind jar 2.0.1

Project Modules

There are no modules declared in this project.

grpc-mock-server

codecov

Features

  • Generate mock services for given proto API and run grpc service with these services.
  • Provide API to mock request/response for grpc service.
  • Can be started in the separate container in the kubernetes for dev enviroment.
  • Provide API for spy functional (can check if method was called with certain response).
  • Provide API for reset mock data.

Before running

Classes for grpc api should be generated in the project. Example for configuration com.google.protobuf gradle plugin.

sourceSets {
    main {
        java {
            srcDirs(
                "${protobuf.protobuf.generatedFilesBaseDir}/main/java/io/github/udarya/mockserver",
                "${protobuf.protobuf.generatedFilesBaseDir}/main/grpckt/io/github/udarya/mockserver",
                "${protobuf.protobuf.generatedFilesBaseDir}/main/grpc/io/github/udarya/mockserver"
            )
        }
        proto {
            dependencies {
                protobuf("io.github.udarya:mock-server:${mock-server-version}")
            }
            srcDir("grpc_mock_api.proto")
        }
    }
}

protobuf {
    protoc {
        artifact = "com.google.protobuf:protoc:${protoc-version}"
    }
    plugins {
        id("grpc") {
            artifact = "io.grpc:protoc-gen-grpc-java:${grpc-version}"
        }
        id("grpckt") {
            artifact = "io.grpc:protoc-gen-grpc-kotlin:${grpc-version}"
        }
    }
    generateProtoTasks {
        ofSourceSet("main").forEach {
            it.plugins {
                id("grpc")
                id("grpckt")
            }
        }
    }
}

grpc-mock-server should be added to the project as gradle dependency:

implementation("io.github.udarya:mock-server:${mock-server-version}")

Running mocks

Generate and run mock for defined proto API.

Example of using mock generator:

@ExperimentalStdlibApi
fun main() {
    val service = generateAndRunGrpcMock(
        port,
        MockStructure("io.github.udarya.mockserver.TestFXAPIGrpcKt", "TestFXAPI")
    )
    service.awaitTermination()
}

io.github.udarya.mockserver.TestFXAPIGrpcKt - kotlin class generated by io.grpc:protoc-gen-grpc-kotlin plugin TestFXAPI - name of service from .proto file

Mock data API

Mock request/response for grpc service.

rpc AddMockData(AddMockDataRequest) returns (AddMockDataResponse);

Request:

message AddMockDataRequest {
  string serviceName = 1; // service name from .proto file
  string methodName = 2;
  string requestJSON = 3; // use `protobuf-java-util` to avoid additional proto fields
  string responseJSON = 4; // use `protobuf-java-util` to avoid additional proto fields
}

Response:

message AddMockDataResponse {

}

Example of use:

mockServerAPIGrpc.addMockData(
    MockServerApiProto.AddMockDataRequest.newBuilder()
        .setServiceName("TestFXAPI") // service name from .proto file
        .setMethodName("getRates")
        .setRequestJson(jsonPrinter.print(getRatesRq))
        .setResponseJson(jsonPrinter.print(getRatesRs))
        .build()
)

Important: use protobuf-java-util to convert request to JSON and avoid additional proto fields (JsonFormat.printer().includingDefaultValueFields()) More examples can be founded in GrpcMockServiceTest.

Verify method call API

rpc VerifyMethodCall(VerifyMethodCallRequest) returns (VerifyMethodCallResponse);

Request:

message VerifyMethodCallRequest {
  string method_name = 1;
  string request_json = 2; // Request with default fields. Use JsonFormat from protobuf-java-util library
  repeated string exclude_fields = 3; // Exclude these fields for comparing
}

Response:

message VerifyMethodCallResponse {
  bool is_success = 1;
  string error_message = 2;
}

Example of use:

mockServerAPIGrpc.verifyMethodCall(
    MockServerApiProto.VerifyMethodCallRequest.newBuilder()
        .setMethodName(testFXAPIGrpc::getRates.name)
        .setRequestJson(jsonPrinter.print(fxRequestWithDifferentCurrencyTo))
        .addAllExcludeFields(listOf("currencyFrom"))
        .build()
)

More examples can be founded in SpyTest.

Reset mock data API

Delete mock data for method.

rpc ResetMethodCalls(ResetMethodCallsRequest) returns (ResetMethodCallsResponse);

Request:

message ResetMethodCallsRequest {
  string method_name = 1;
}

Response:

message ResetMethodCallsResponse {

}

Example of use:

mockServerAPIGrpc.resetMethodCalls(
    MockServerApiProto.ResetMethodCallsRequest.newBuilder()
        .setMethodName("getRates")
        .build()
)

More examples can be founded in SpyTest.

Versions

Version
0.2
0.1