Mocking of ReadObject can be achieved by mockingObjectWriteStreambuf. The following code snippet explains this
TEST(StorageMockingSamples, MockWriteObject) {
namespace gcs = ::google::cloud::storage;
std::shared_ptr<gcs::testing::MockClient> mock =
std::make_shared<gcs::testing::MockClient>();
auto client = gcs::testing::UndecoratedClientFromMock(mock);
gcs::ObjectMetadata expected_metadata;
using gcs::internal::CreateResumableUploadResponse;
using gcs::internal::QueryResumableUploadResponse;
EXPECT_CALL(*mock, CreateResumableUpload)
.WillOnce(Return(CreateResumableUploadResponse{"test-only-upload-id"}));
EXPECT_CALL(*mock, UploadChunk)
.WillOnce(Return(QueryResumableUploadResponse{
/*.committed_size=*/absl::nullopt,
/*.object_metadata=*/expected_metadata}));
auto stream = client.WriteObject("mock-bucket-name", "mock-object-name");
stream << "Hello World!";
stream.Close();
Mocking Failed call of WriteObject()
Mocking of ReadObject can be achieved by mockingObjectWriteStreambuf. The following code snippet explains this
TEST(StorageMockingSamples, MockWriteObjectFailure) {
namespace gcs = ::google::cloud::storage;
std::shared_ptr<gcs::testing::MockClient> mock =
std::make_shared<gcs::testing::MockClient>();
auto client = gcs::testing::UndecoratedClientFromMock(mock);
using gcs::internal::CreateResumableUploadResponse;
using gcs::internal::QueryResumableUploadResponse;
EXPECT_CALL(*mock, CreateResumableUpload)
.WillOnce(Return(CreateResumableUploadResponse{"test-only-upload-id"}));
EXPECT_CALL(*mock, UploadChunk)
.WillOnce(Return(google::cloud::Status{
google::cloud::StatusCode::kInvalidArgument, "Invalid Argument"}));
auto stream = client.WriteObject("mock-bucket-name", "mock-object-name");
stream << "Hello World!";
stream.Close();
EXPECT_TRUE(stream.bad());
}
The documentation for each member function in theClientclass includes short snippets on how to call the function. The snippets forReadObject(),WriteObject(),ListObjects(), andDeleteObject()are good places to continue learning about the library.
[[["Easy to understand","easyToUnderstand","thumb-up"],["Solved my problem","solvedMyProblem","thumb-up"],["Other","otherUp","thumb-up"]],[["Hard to understand","hardToUnderstand","thumb-down"],["Incorrect information or sample code","incorrectInformationOrSampleCode","thumb-down"],["Missing the information/samples I need","missingTheInformationSamplesINeed","thumb-down"],["Other","otherDown","thumb-down"]],["Last updated 2025-09-04 UTC."],[[["\u003cp\u003eThis document provides examples of how to mock Google Cloud Storage (GCS) bucket read and write operations using the gmock framework, which is helpful for developers utilizing the GCS C++ client library.\u003c/p\u003e\n"],["\u003cp\u003eSuccessful and failed calls to \u003ccode\u003eReadObject()\u003c/code\u003e can be mocked by creating a \u003ccode\u003eMockObjectReadSource\u003c/code\u003e object, allowing developers to simulate various responses from the GCS API.\u003c/p\u003e\n"],["\u003cp\u003eSuccessful and failed calls to \u003ccode\u003eWriteObject()\u003c/code\u003e can be mocked by manipulating \u003ccode\u003eObjectWriteStreambuf\u003c/code\u003e, enabling tests to handle different upload scenarios.\u003c/p\u003e\n"],["\u003cp\u003eThe document also outlines the availability of past versions of the API reference, ranging from 2.11.0 to 2.37.0-rc, which is the latest release candidate.\u003c/p\u003e\n"]]],[],null,["Version 2.16.0keyboard_arrow_down\n\n- [2.42.0-rc (latest)](/cpp/docs/reference/storage/latest/storage-mocking)\n- [2.41.0](/cpp/docs/reference/storage/2.41.0/storage-mocking)\n- [2.40.0](/cpp/docs/reference/storage/2.40.0/storage-mocking)\n- [2.39.0](/cpp/docs/reference/storage/2.39.0/storage-mocking)\n- [2.38.0](/cpp/docs/reference/storage/2.38.0/storage-mocking)\n- [2.37.0](/cpp/docs/reference/storage/2.37.0/storage-mocking)\n- [2.36.0](/cpp/docs/reference/storage/2.36.0/storage-mocking)\n- [2.35.0](/cpp/docs/reference/storage/2.35.0/storage-mocking)\n- [2.34.0](/cpp/docs/reference/storage/2.34.0/storage-mocking)\n- [2.33.0](/cpp/docs/reference/storage/2.33.0/storage-mocking)\n- [2.32.0](/cpp/docs/reference/storage/2.32.0/storage-mocking)\n- [2.31.0](/cpp/docs/reference/storage/2.31.0/storage-mocking)\n- [2.30.0](/cpp/docs/reference/storage/2.30.0/storage-mocking)\n- [2.29.0](/cpp/docs/reference/storage/2.29.0/storage-mocking)\n- [2.28.0](/cpp/docs/reference/storage/2.28.0/storage-mocking)\n- [2.27.0](/cpp/docs/reference/storage/2.27.0/storage-mocking)\n- [2.26.0](/cpp/docs/reference/storage/2.26.0/storage-mocking)\n- [2.25.1](/cpp/docs/reference/storage/2.25.1/storage-mocking)\n- [2.24.0](/cpp/docs/reference/storage/2.24.0/storage-mocking)\n- [2.23.0](/cpp/docs/reference/storage/2.23.0/storage-mocking)\n- [2.22.1](/cpp/docs/reference/storage/2.22.1/storage-mocking)\n- [2.21.0](/cpp/docs/reference/storage/2.21.0/storage-mocking)\n- [2.20.0](/cpp/docs/reference/storage/2.20.0/storage-mocking)\n- [2.19.0](/cpp/docs/reference/storage/2.19.0/storage-mocking)\n- [2.18.0](/cpp/docs/reference/storage/2.18.0/storage-mocking)\n- [2.17.0](/cpp/docs/reference/storage/2.17.0/storage-mocking)\n- [2.16.0](/cpp/docs/reference/storage/2.16.0/storage-mocking)\n- [2.15.1](/cpp/docs/reference/storage/2.15.1/storage-mocking)\n- [2.14.0](/cpp/docs/reference/storage/2.14.0/storage-mocking)\n- [2.13.0](/cpp/docs/reference/storage/2.13.0/storage-mocking)\n- [2.12.0](/cpp/docs/reference/storage/2.12.0/storage-mocking)\n- [2.11.0](/cpp/docs/reference/storage/2.11.0/storage-mocking) \n\nWriting Tests with a Mock Client\n================================\n\n### Mocking GCS bucket read and write\n\nIt is possible to mock GCS bucket read and write using gmock framework, this is specially useful for developer using GCS C++ client library.\n\n#### Mocking Successful call of ReadObject()\n\nMocking of ReadObject can be achieved by mocking `ObjectReadSource`. The following code snippet explains this \n\n TEST(StorageMockingSamples, MockReadObject) {\n namespace gcs = ::google::cloud::storage;\n\n std::shared_ptr\u003cgcs::testing::MockClient\u003e mock =\n std::make_shared\u003cgcs::testing::MockClient\u003e();\n auto client = gcs::testing::UndecoratedClientFromMock(mock);\n\n std::string const text = \"this is a mock http response\";\n std::size_t offset = 0;\n // Simulate a Read() call in the MockObjectReadSource object created below\n auto simulate_read = [&text, &offset](void* buf, std::size_t n) {\n auto const l = (std::min)(n, text.size() - offset);\n std::memcpy(buf, text.data() + offset, l);\n offset += l;\n return gcs::internal::ReadSourceResult{\n l, gcs::internal::HttpResponse{200, {}, {}}};\n };\n EXPECT_CALL(*mock, ReadObject)\n .WillOnce([&](gcs::internal::ReadObjectRangeRequest const& request) {\n EXPECT_EQ(request.bucket_name(), \"mock-bucket-name\") \u003c\u003c request;\n std::unique_ptr\u003cgcs::testing::MockObjectReadSource\u003e mock_source(\n new gcs::testing::MockObjectReadSource);\n ::testing::InSequence seq;\n EXPECT_CALL(*mock_source, IsOpen()).WillRepeatedly(Return(true));\n EXPECT_CALL(*mock_source, Read).WillOnce(simulate_read);\n EXPECT_CALL(*mock_source, IsOpen()).WillRepeatedly(Return(false));\n\n return google::cloud::make_status_or(\n std::unique_ptr\u003cgcs::internal::ObjectReadSource\u003e(\n std::move(mock_source)));\n });\n\n gcs::ObjectReadStream stream =\n client.ReadObject(\"mock-bucket-name\", \"mock-object-name\");\n\n // Reading the payload of http response stored in stream\n std::string actual{std::istreambuf_iterator\u003cchar\u003e(stream), {}};\n EXPECT_EQ(actual, text);\n stream.Close();\n }\n\n#### Mocking Failed call of ReadObject()\n\nMocking of ReadObject can be achieved by mocking `ObjectReadSource`. The following code snippet explains this \n\n TEST(StorageMockingSamples, MockReadObjectFailure) {\n namespace gcs = ::google::cloud::storage;\n\n std::shared_ptr\u003cgcs::testing::MockClient\u003e mock =\n std::make_shared\u003cgcs::testing::MockClient\u003e();\n auto client = gcs::testing::UndecoratedClientFromMock(mock);\n\n std::string text = \"this is a mock http response\";\n EXPECT_CALL(*mock, ReadObject)\n .WillOnce([](gcs::internal::ReadObjectRangeRequest const& request) {\n EXPECT_EQ(request.bucket_name(), \"mock-bucket-name\") \u003c\u003c request;\n auto* mock_source = new gcs::testing::MockObjectReadSource;\n ::testing::InSequence seq;\n EXPECT_CALL(*mock_source, IsOpen).WillRepeatedly(Return(true));\n EXPECT_CALL(*mock_source, Read)\n .WillOnce(Return(google::cloud::Status(\n google::cloud::StatusCode::kInvalidArgument,\n \"Invalid Argument\")));\n EXPECT_CALL(*mock_source, IsOpen).WillRepeatedly(Return(false));\n\n std::unique_ptr\u003cgcs::internal::ObjectReadSource\u003e result(mock_source);\n\n return google::cloud::make_status_or(std::move(result));\n });\n\n gcs::ObjectReadStream stream =\n client.ReadObject(\"mock-bucket-name\", \"mock-object-name\");\n EXPECT_TRUE(stream.bad());\n stream.Close();\n }\n\n#### Mocking Successful call of WriteObject()\n\nMocking of ReadObject can be achieved by mocking `ObjectWriteStreambuf`. The following code snippet explains this \n\n TEST(StorageMockingSamples, MockWriteObject) {\n namespace gcs = ::google::cloud::storage;\n\n std::shared_ptr\u003cgcs::testing::MockClient\u003e mock =\n std::make_shared\u003cgcs::testing::MockClient\u003e();\n auto client = gcs::testing::UndecoratedClientFromMock(mock);\n\n gcs::ObjectMetadata expected_metadata;\n\n using gcs::internal::CreateResumableUploadResponse;\n using gcs::internal::QueryResumableUploadResponse;\n EXPECT_CALL(*mock, CreateResumableUpload)\n .WillOnce(Return(CreateResumableUploadResponse{\"test-only-upload-id\"}));\n EXPECT_CALL(*mock, UploadChunk)\n .WillOnce(Return(QueryResumableUploadResponse{\n /*.committed_size=*/absl::nullopt,\n /*.object_metadata=*/expected_metadata}));\n\n auto stream = client.WriteObject(\"mock-bucket-name\", \"mock-object-name\");\n stream \u003c\u003c \"Hello World!\";\n stream.Close();\n\n#### Mocking Failed call of WriteObject()\n\nMocking of ReadObject can be achieved by mocking `ObjectWriteStreambuf`. The following code snippet explains this \n\n TEST(StorageMockingSamples, MockWriteObjectFailure) {\n namespace gcs = ::google::cloud::storage;\n\n std::shared_ptr\u003cgcs::testing::MockClient\u003e mock =\n std::make_shared\u003cgcs::testing::MockClient\u003e();\n auto client = gcs::testing::UndecoratedClientFromMock(mock);\n\n using gcs::internal::CreateResumableUploadResponse;\n using gcs::internal::QueryResumableUploadResponse;\n EXPECT_CALL(*mock, CreateResumableUpload)\n .WillOnce(Return(CreateResumableUploadResponse{\"test-only-upload-id\"}));\n EXPECT_CALL(*mock, UploadChunk)\n .WillOnce(Return(google::cloud::Status{\n google::cloud::StatusCode::kInvalidArgument, \"Invalid Argument\"}));\n\n auto stream = client.WriteObject(\"mock-bucket-name\", \"mock-object-name\");\n stream \u003c\u003c \"Hello World!\";\n stream.Close();\n\n EXPECT_TRUE(stream.bad());\n }\n\nThe documentation for each member function in the [Client](/cpp/docs/reference/storage/2.16.0/classgoogle_1_1cloud_1_1storage_1_1Client) class includes short snippets on how to call the function. The snippets for [ReadObject()](/cpp/docs/reference/storage/2.16.0/classgoogle_1_1cloud_1_1storage_1_1Client#classgoogle_1_1cloud_1_1storage_1_1Client_1a8b0575846b68475f6b1f7ef950b49323), [WriteObject()](/cpp/docs/reference/storage/2.16.0/classgoogle_1_1cloud_1_1storage_1_1Client#classgoogle_1_1cloud_1_1storage_1_1Client_1a8918b5f338d91607b06d5107965ed35e), [ListObjects()](/cpp/docs/reference/storage/2.16.0/classgoogle_1_1cloud_1_1storage_1_1Client#classgoogle_1_1cloud_1_1storage_1_1Client_1ac632b30c61f6447eb35ce393a63070f5), and [DeleteObject()](/cpp/docs/reference/storage/2.16.0/classgoogle_1_1cloud_1_1storage_1_1Client#classgoogle_1_1cloud_1_1storage_1_1Client_1a57e64a4e994c07e6d360c647ca57e96f) are good places to continue learning about the library."]]