Testing your Cloud IAM application with googlemock
Stay organized with collections
Save and categorize content based on your preferences.
This document describes how to test your own Cloud IAM application using the Cloud IAM C++ client library, Google Test and the Google Test Mocking Framework.
Mocking a Successful IAMClient::GetServiceAccount() call
First include the headers for the Cloud IAM Client, the mocking class, and the Google Mock framework:
#include "google/cloud/iam/admin/v1/iam_client.h"
#include "google/cloud/iam/admin/v1/mocks/mock_iam_connection.h"
#include <gmock/gmock.h>
The example uses a number of aliases to save typing and improve readability:
using ::google::cloud::iam_admin_v1_mocks::MockIAMConnection;
namespace iam = ::google::cloud::iam_admin_v1;
Create a mocking object for google::cloud::iam_admin_v1::IAMConnection
:
auto mock = std::make_shared<MockIAMConnection>();
It is customary to first setup the expectations for your mock, and then write the rest of the code:
EXPECT_CALL(*mock, GetServiceAccount)
.WillOnce([&](google::iam::admin::v1::GetServiceAccountRequest const&
request) {
EXPECT_EQ("test-project-name", request.name());
google::iam::admin::v1::ServiceAccount service_account;
service_account.set_unique_id("test-unique-id");
return google::cloud::StatusOr<google::iam::admin::v1::ServiceAccount>(
service_account);
});
With the expectations in place, create a google::cloud::iam_admin_v1::IAMClient
object:
iam::IAMClient iam_client(mock);
And then make calls on the client as usual:
auto service_account = iam_client.GetServiceAccount("test-project-name");
And then verify the results meet your expectations:
EXPECT_TRUE(service_account.ok());
EXPECT_EQ("test-unique-id", service_account->unique_id());
Full Listing
Finally we present the full code for this example:
#include "google/cloud/iam/admin/v1/iam_client.h"
#include "google/cloud/iam/admin/v1/mocks/mock_iam_connection.h"
#include <gmock/gmock.h>
namespace {
using ::google::cloud::iam_admin_v1_mocks::MockIAMConnection;
namespace iam = ::google::cloud::iam_admin_v1;
TEST(MockGetServiceAccountExample, GetServiceAccount) {
auto mock = std::make_shared<MockIAMConnection>();
EXPECT_CALL(*mock, GetServiceAccount)
.WillOnce([&](google::iam::admin::v1::GetServiceAccountRequest const&
request) {
EXPECT_EQ("test-project-name", request.name());
google::iam::admin::v1::ServiceAccount service_account;
service_account.set_unique_id("test-unique-id");
return google::cloud::StatusOr<google::iam::admin::v1::ServiceAccount>(
service_account);
});
iam::IAMClient iam_client(mock);
auto service_account = iam_client.GetServiceAccount("test-project-name");
EXPECT_TRUE(service_account.ok());
EXPECT_EQ("test-unique-id", service_account->unique_id());
}
} // namespace