'Verify content of nlohmann json which is member of mocked method argument

Assume I got a some Message class object which has nlohmann json as private member and public getter:

class Message{
public:
  nlohmann::json getJson() { return json_;}
  ...
private:
  nlohmann::json json_;
  ...
};

Also there is a class that publishes the message

ex:

class Foo {
public:
  publish(const Message& message)
  ...
};

In the test I am mocking the Foo::publish method and in some scenario I want to check if json_["key1"]["key2"] value is different than "" (empty string)

EXPECT_CALL(
  *foo_mock_pointer,
  publish(x) // x is the unknown code
);

For checking the value of the json object I guess it will be enough: testing::Contains(testing::Pair("key1", testing::Pair("key2"), testing::Ne("")))

But I cant figure out how to get the json from Message object which is the argument of the mocked method.



Solution 1:[1]

IIUC, it looks like you want to check something about the argument that is passed to your mock function. You can use SaveArg to save that argument inside a variable and then check its value later:

Message message;

EXPECT_CALL(
  *foo_mock_pointer,
  publish(x) // x is the unknown code
).WillOnce(DoAll(SaveArg<0>(&message), Return(/*Whatever you want to return*/)));

// Call your class-under-test API here
// ...

// Now check the message:
EXPECT_THAT(message.getJson(), /*Insert your matcher here*/);

See here for more info: http://google.github.io/googletest/gmock_cook_book.html#SaveArgVerify

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Ari