Mocking of ReadObject can be achieved by mocking ObjectWriteStreambuf. 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 mocking ObjectWriteStreambuf. 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 the Client class includes short snippets on how to call the function. The snippets for ReadObject(), WriteObject(), ListObjects(), and DeleteObject() 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"]],[["Missing the information I need","missingTheInformationINeed","thumb-down"],["Too complicated / too many steps","tooComplicatedTooManySteps","thumb-down"],["Out of date","outOfDate","thumb-down"],["Samples / code issue","samplesCodeIssue","thumb-down"],["Other","otherDown","thumb-down"]],["Last updated 2025-08-14 UTC."],[[["\u003cp\u003eThe latest version of the storage documentation is 2.37.0-rc, with previous versions available ranging from 2.36.0 down to 2.11.0.\u003c/p\u003e\n"],["\u003cp\u003eThe document provides guidance on how to mock Google Cloud Storage (GCS) bucket read and write operations using the gmock framework, which is beneficial for developers using the GCS C++ client library.\u003c/p\u003e\n"],["\u003cp\u003eExamples are given to simulate both successful and failed \u003ccode\u003eReadObject()\u003c/code\u003e calls by mocking the \u003ccode\u003eObjectReadSource\u003c/code\u003e, allowing developers to test different scenarios in their code.\u003c/p\u003e\n"],["\u003cp\u003eThe document further outlines how to simulate successful and failed \u003ccode\u003eWriteObject()\u003c/code\u003e calls by mocking \u003ccode\u003eObjectWriteStreambuf\u003c/code\u003e, which allows developers to write test cases for different outcomes when writing to a GCS bucket.\u003c/p\u003e\n"],["\u003cp\u003eAdditional information on using the \u003ccode\u003eClient\u003c/code\u003e class can be found in the documentation, with code snippets for \u003ccode\u003eReadObject()\u003c/code\u003e, \u003ccode\u003eWriteObject()\u003c/code\u003e, \u003ccode\u003eListObjects()\u003c/code\u003e, and \u003ccode\u003eDeleteObject()\u003c/code\u003e available.\u003c/p\u003e\n"]]],[],null,["Version latestkeyboard_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/latest/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/latest/classgoogle_1_1cloud_1_1storage_1_1Client#classgoogle_1_1cloud_1_1storage_1_1Client_1a8b0575846b68475f6b1f7ef950b49323), [WriteObject()](/cpp/docs/reference/storage/latest/classgoogle_1_1cloud_1_1storage_1_1Client#classgoogle_1_1cloud_1_1storage_1_1Client_1a8918b5f338d91607b06d5107965ed35e), [ListObjects()](/cpp/docs/reference/storage/latest/classgoogle_1_1cloud_1_1storage_1_1Client#classgoogle_1_1cloud_1_1storage_1_1Client_1ac632b30c61f6447eb35ce393a63070f5), and [DeleteObject()](/cpp/docs/reference/storage/latest/classgoogle_1_1cloud_1_1storage_1_1Client#classgoogle_1_1cloud_1_1storage_1_1Client_1a57e64a4e994c07e6d360c647ca57e96f) are good places to continue learning about the library."]]