Frankly GMock was the only candidate, the commercial alternatives being out as this was for an OSS project, but the instructions all seemed to want to build a number of libraries (64/32 bit Debug/Release) that I would have to statically link to and maintain these builds should the source or build options change. I decided to try a different tack that wouldn't involve building libraries and it has worked out reasonably successful, so I thought it would be worth commenting on here.
Step 1
Get the latest GMock (1.7.0) library as a zip file and uncompress it somewhere within your repository.
Step 2
From within Visual Studio update the Additional Include Directories to include the following paths
$(SolutionDir)lib\gmock-1.7.0 $(SolutionDir)lib\gmock-1.7.0\include $(SolutionDir)lib\gmock-1.7.0\gtest $(SolutionDir)lib\gmock-1.7.0\gtest\include
Step 3
Add the following to your "stdafx.h"
#include "gmock/gmock.h" #include "gtest/gtest.h"
Step 4
Add the following to your "stdafx.cpp"
// The following lines pull in the real gmock *.cc files. #include "src/gmock-cardinalities.cc" #include "src/gmock-internal-utils.cc" #include "src/gmock-matchers.cc" #include "src/gmock-spec-builders.cc" #include "src/gmock.cc" // The following lines pull in the real gtest *.cc files. #include "src/gtest.cc" #include "src/gtest-death-test.cc" #include "src/gtest-filepath.cc" #include "src/gtest-port.cc" #include "src/gtest-printers.cc" #include "src/gtest-test-part.cc" #include "src/gtest-typed-test.cc"
Step 5
Now all you need to do is add initialise GMock and you are ready; as I am using the CppUnitTestFramework I do the following.TEST_MODULE_INITIALIZE(ModuleInitialize) { // enable google mock ::testing::GTEST_FLAG(throw_on_failure) = true; int argc = 0; TCHAR **argv = NULL; ::testing::InitGoogleMock(&argc, argv); }
Now all you need to do is follow the GMock documentation and add some expectations etc you can as I discovered even mock COM objects and have expectations on them e.g.
EXPECT_CALL(*profilerInfo, SetEventMask(EVENT_MASK_WHEN_FAKES)) .Times(1) .WillRepeatedly(Return(S_OK));
Bonus Round
There were a few little niggles however the first of which is that if an expectation fails, the Visual Studio test runner takes a little too long to close down (I suspect this may be something on my machine related to DrWatson).
The second was that if an expectation did fail I could only initially see the result using DebugView - ugh - however I found a solution at http://www.durwella.com/post/96457792632/extending-microsoft-cppunittestframework which involves using some extra macros, which I added to my "stdafx.h" and voila the results are now available in Visual Studio.
Finally, I found the mocks were not very lightweight and in fact if I left them hooked in caused performance issues however replacing them with an admittedly less useful stub I could avoid this when necessary.
No comments:
Post a Comment