GAIO CLUB
EXPECT_CALL(mock, GetTemperature()) // GetTemperatureモックの動作定義
.Times(AtLeast(2)) // 呼出し回数は最低2回
.WillOnce(Return(29)) // 最初のGetTemperature(モック)は29℃を返す
.WillOnce(Return(21)); // 2度目の GetTemperature(モック)は21℃を返す
TEST_F(AirConditionerControllerTest, OffModeTest) {
DefaultValue<int>::Set(29); // デフォルトの戻り値は 29℃
EXPECT_CALL(mock, GetTemperature())
.Times(AtLeast(1)) // 呼出し回数は1回以上
.WillOnce(Return(21)); // 最初のGetTemperature(モック)は21℃を返す
airConditionerController.AutoMode();
EXPECT_EQ(MODE_OFF, airConditionerController.GetMode());
airConditionerController.AutoMode();
EXPECT_EQ(MODE_OFF, airConditionerController.GetMode());
DefaultValue<int>::Clear(); // デフォルト設定のクリア
}
TEST_F(AirConditionerControllerTest, HeattingTest) {
ON_CALL(mock, GetTemperature())
.WillByDefault(Return(19)); // GetTemperature(モック)デフォルト戻り値は19℃
EXPECT_CALL(mock, GetTemperature())
.Times(AtLeast(1)) // 呼出し回数は1回以上
.WillOnce(Return(20)); // 最初のGetTemperature(モック)は20℃を返す
airConditionerController.AutoMode();
EXPECT_EQ(MODE_HEATING, airConditionerController.GetMode());
airConditionerController.AutoMode();
EXPECT_EQ(MODE_HEATING, airConditionerController.GetMode());
}
TEST_F(AirConditionerControllerTest, CoolingTest) {
EXPECT_CALL(mock, GetTemperature())
.Times(AtLeast(2)) // 呼出し回数は2回以上
.WillOnce(Return(30)) // 最初のGetTemperature(モック)は30℃を返す
.WillRepeatedly(Return(31)); // 2回目以降は繰り返し31℃を返す
airConditionerController.AutoMode();
EXPECT_EQ(MODE_COOLING, airConditionerController.GetMode());
airConditionerController.AutoMode();
EXPECT_EQ(MODE_COOLING, airConditionerController.GetMode());
}
Running main() from /usr/local/src/googletest-1.14.0/googletest/src/gtest_main.cc
[==========] Running 3 tests from 1 test suite.
[----------] Global test environment set-up.
[----------] 3 tests from AirConditionerControllerTest
[ RUN ] AirConditionerControllerTest.OffModeTest
GMOCK WARNING:
AirConditionerController_test.cpp:28: Actions ran out in EXPECT_CALL(mock, GetTemperature())...
Called 2 times, but only 1 WillOnce() is specified - returning default value.
Stack trace:
[ OK ] AirConditionerControllerTest.OffModeTest (0 ms)
[ RUN ] AirConditionerControllerTest.HeattingTest
GMOCK WARNING:
AirConditionerController_test.cpp:42: Actions ran out in EXPECT_CALL(mock, GetTemperature())...
Called 2 times, but only 1 WillOnce() is specified - taking default action specified at:
AirConditionerController_test.cpp:40:
Stack trace:
[ OK ] AirConditionerControllerTest.HeattingTest (0 ms)
[ RUN ] AirConditionerControllerTest.CoolingTest
[ OK ] AirConditionerControllerTest.CoolingTest (0 ms)
[----------] 3 tests from AirConditionerControllerTest (0 ms total)
[----------] Global test environment tear-down
[==========] 3 tests from 1 test suite ran. (0 ms total)
[ PASSED ] 3 tests.
using ::testing::AtLeast;
using ::testing::Return;
using ::testing::Test;
// テストフィクスチャクラスの定義
class AirConditionerControllerTest : public Test {
protected:
MockTemperatureSensor mock;
AirConditionerController airConditionerController = AirConditionerController(&mock);
virtual void SetUp() {
airConditionerController.Init();
}
};
TEST_F(AirConditionerControllerTest, OffModeTest) {
mock.DelegateToFake(); // デフォルト処理を行うメソッドの設定
airConditionerController.AutoMode();
EXPECT_EQ(MODE_OFF, airConditionerController.GetMode());
airConditionerController.AutoMode();
EXPECT_EQ(MODE_OFF, airConditionerController.GetMode());
}
TEST_F(AirConditionerControllerTest, HeattingTest) {
mock.DelegateToFake(); // デフォルト処理を行うメソッドの設定
airConditionerController.AutoMode();
EXPECT_EQ(MODE_HEATING, airConditionerController.GetMode());
airConditionerController.AutoMode();
EXPECT_EQ(MODE_HEATING, airConditionerController.GetMode());
}
TEST_F(AirConditionerControllerTest, CoolingTest) {
mock.DelegateToFake(); // デフォルト処理を行うメソッドの設定
airConditionerController.AutoMode();
EXPECT_EQ(MODE_COOLING, airConditionerController.GetMode());
airConditionerController.AutoMode();
EXPECT_EQ(MODE_COOLING, airConditionerController.GetMode());
}
using ::testing::_;
using ::testing::Invoke;
/**
* TemperatureSensor
* 温度センサのMock
*/
class MockTemperatureSensor : public TemperatureSensor {
public:
MOCK_METHOD(int , GetTemperature, ());
// メソッドのデフォルトActionをFakeTemperatureSensorオブジェクトに委譲
// これは必ずON_CALL()文よりも前に呼ばれる必要がある
void DelegateToFake() {
ON_CALL(*this, GetTemperature())
.WillByDefault(Invoke(&fake_, &FakeTemperatureSensor::GetTemperature));
}
private:
FakeTemperatureSensor fake_; // フェイクのインスタンスはモック内部に保持
};
/**
* TemperatureSensor
* 温度センサ
*/
class TemperatureSensor {
public:
virtual int GetTemperature() = 0;
};
static int ret_idx=0,ret[]={29,21,20,19,30,31,0};
// デフォルト処理を行うメソッド、上記配列の値を順に返す
class FakeTemperatureSensor : public TemperatureSensor {
public:
virtual int GetTemperature() {
return ret[ret_idx++];
}
};
Running main() from /usr/local/src/googletest-1.14.0/googletest/src/gtest_main.cc
[==========] Running 3 tests from 1 test suite.
[----------] Global test environment set-up.
[----------] 3 tests from AirConditionerControllerTest
[ RUN ] AirConditionerControllerTest.OffModeTest
GMOCK WARNING:
Uninteresting mock function call - taking default action specified at:
MockTemperatureSensor.h:21:
Function call: GetTemperature()
Returns: 29
NOTE: You can safely ignore the above warning unless this call should not happen. Do not suppress it by blindly adding an EXPECT_CALL() if you don't mean to enforce the call. See https://github.com/google/googletest/blob/main/docs/gmock_cook_book.md#knowing-when-to-expect-useoncall for details.
GMOCK WARNING:
Uninteresting mock function call - taking default action specified at:
MockTemperatureSensor.h:21:
Function call: GetTemperature()
Returns: 21
NOTE: You can safely ignore the above warning unless this call should not happen. Do not suppress it by blindly adding an EXPECT_CALL() if you don't mean to enforce the call. See https://github.com/google/googletest/blob/main/docs/gmock_cook_book.md#knowing-when-to-expect-useoncall for details.
[ OK ] AirConditionerControllerTest.OffModeTest (0 ms)
[ RUN ] AirConditionerControllerTest.HeattingTest
GMOCK WARNING:
Uninteresting mock function call - taking default action specified at:
MockTemperatureSensor.h:21:
Function call: GetTemperature()
Returns: 20
NOTE: You can safely ignore the above warning unless this call should not happen. Do not suppress it by blindly adding an EXPECT_CALL() if you don't mean to enforce the call. See https://github.com/google/googletest/blob/main/docs/gmock_cook_book.md#knowing-when-to-expect-useoncall for details.
GMOCK WARNING:
Uninteresting mock function call - taking default action specified at:
MockTemperatureSensor.h:21:
Function call: GetTemperature()
Returns: 19
NOTE: You can safely ignore the above warning unless this call should not happen. Do not suppress it by blindly adding an EXPECT_CALL() if you don't mean to enforce the call. See https://github.com/google/googletest/blob/main/docs/gmock_cook_book.md#knowing-when-to-expect-useoncall for details.
[ OK ] AirConditionerControllerTest.HeattingTest (0 ms)
[ RUN ] AirConditionerControllerTest.CoolingTest
GMOCK WARNING:
Uninteresting mock function call - taking default action specified at:
MockTemperatureSensor.h:21:
Function call: GetTemperature()
Returns: 30
NOTE: You can safely ignore the above warning unless this call should not happen. Do not suppress it by blindly adding an EXPECT_CALL() if you don't mean to enforce the call. See https://github.com/google/googletest/blob/main/docs/gmock_cook_book.md#knowing-when-to-expect-useoncall for details.
GMOCK WARNING:
Uninteresting mock function call - taking default action specified at:
MockTemperatureSensor.h:21:
Function call: GetTemperature()
Returns: 31
NOTE: You can safely ignore the above warning unless this call should not happen. Do not suppress it by blindly adding an EXPECT_CALL() if you don't mean to enforce the call. See https://github.com/google/googletest/blob/main/docs/gmock_cook_book.md#knowing-when-to-expect-useoncall for details.
[ OK ] AirConditionerControllerTest.CoolingTest (0 ms)
[----------] 3 tests from AirConditionerControllerTest (0 ms total)
[----------] Global test environment tear-down
[==========] 3 tests from 1 test suite ran. (0 ms total)
[ PASSED ] 3 tests.
using ::testing::AtLeast;
using ::testing::Return;
using ::testing::Test;
using ::testing::NiceMock;
// テストフィクスチャクラスの定義
class AirConditionerControllerTest : public Test {
protected:
// MockTemperatureSensor mock;
NiceMock mock;
AirConditionerController airConditionerController = AirConditionerController(&mock);
virtual void SetUp() {
airConditionerController.Init();
}
};
Running main() from /usr/local/src/googletest-1.14.0/googletest/src/gtest_main.cc
[==========] Running 3 tests from 1 test suite.
[----------] Global test environment set-up.
[----------] 3 tests from AirConditionerControllerTest
[ RUN ] AirConditionerControllerTest.OffModeTest
[ OK ] AirConditionerControllerTest.OffModeTest (0 ms)
[ RUN ] AirConditionerControllerTest.HeattingTest
[ OK ] AirConditionerControllerTest.HeattingTest (0 ms)
[ RUN ] AirConditionerControllerTest.CoolingTest
[ OK ] AirConditionerControllerTest.CoolingTest (0 ms)
[----------] 3 tests from AirConditionerControllerTest (0 ms total)
[----------] Global test environment tear-down
[==========] 3 tests from 1 test suite ran. (0 ms total)
[ PASSED ] 3 tests.
using ::testing::AtLeast;
using ::testing::Return;
using ::testing::Test;
using ::testing::AnyOf;
using ::testing::Eq;
// テストフィクスチャクラスの定義
class AirConditionerControllerTest : public Test {
protected:
MockTemperatureSensor mock;
AirConditionerController airConditionerController = AirConditionerController(&mock);
virtual void SetUp() {
airConditionerController.Init();
}
};
TEST_F(AirConditionerControllerTest, OffModeTest) { // オフモードのテスト
EXPECT_CALL(mock, GetTemperature())
.Times(AtLeast(2)) // 呼び出し回数は2回以上
.WillOnce(Return(29)) // 最初は、29℃を返す
.WillOnce(Return(21)); // 2回目は、21℃を返す
airConditionerController.AutoMode();
// 設定モードが OFF・COOLING・HEATINGのいずれかになること
EXPECT_THAT(airConditionerController.GetMode(),
AnyOf(Eq(MODE_OFF),Eq(MODE_COOLING),Eq(MODE_HEATING)));
airConditionerController.AutoMode();
// 設定モードが 0・1・3 のいずれかになること
EXPECT_THAT(airConditionerController.GetMode(),AnyOf(Eq(0),Eq(1),Eq(3)));
}
TEST_F(AirConditionerControllerTest, HeattingTest) { // 暖房モードのテスト
EXPECT_CALL(mock, GetTemperature())
.Times(AtLeast(2)) // 呼び出し回数は2回以上
.WillOnce(Return(20)) // 最初は、20℃を返す
.WillOnce(Return(19)); // 2回目は、19℃を返す
airConditionerController.AutoMode();
// 設定モードが OFF・COOLING・HEATINGのいずれかになること
EXPECT_THAT(airConditionerController.GetMode(),
AnyOf(Eq(MODE_OFF),Eq(MODE_COOLING),Eq(MODE_HEATING)));
airConditionerController.AutoMode();
// 設定モードが 0・1・3 のいずれかになること
EXPECT_THAT(airConditionerController.GetMode(),AnyOf(Eq(0),Eq(1),Eq(3)));
}
TEST_F(AirConditionerControllerTest, CoolingTest) { // 冷房モードのテスト
EXPECT_CALL(mock, GetTemperature())
.Times(AtLeast(2)) // 呼び出し回数は2回以上
.WillOnce(Return(30)) // 最初は、30℃を返す
.WillOnce(Return(31)); // 2回目は、31℃を返す
airConditionerController.AutoMode();
// 設定モードが OFF・COOLING・HEATINGのいずれかになること
EXPECT_THAT(airConditionerController.GetMode(),
AnyOf(Eq(MODE_OFF),Eq(MODE_COOLING),Eq(MODE_HEATING)));
airConditionerController.AutoMode();
// 設定モードが 0・1・3 のいずれかになること
EXPECT_THAT(airConditionerController.GetMode(),AnyOf(Eq(0),Eq(1),Eq(3)));
}
EXPECT_THAT(airConditionerController.GetMode(),
AnyOf(Eq(MODE_OFF),Eq(MODE_COOLING),Eq(MODE_HEATING)));
EXPECT_THAT(airConditionerController.GetMode(),AnyOf(Eq(0),Eq(1),Eq(3)));
Running main() from /usr/local/src/googletest-1.14.0/googletest/src/gtest_main.cc
[==========] Running 3 tests from 1 test suite.
[----------] Global test environment set-up.
[----------] 3 tests from AirConditionerControllerTest
[ RUN ] AirConditionerControllerTest.OffModeTest
[ OK ] AirConditionerControllerTest.OffModeTest (0 ms)
[ RUN ] AirConditionerControllerTest.HeattingTest
AirConditionerController_test.cpp:53: Failure
Value of: airConditionerController.GetMode()
Expected: (is equal to 0) or (is equal to 1) or (is equal to 3)
Actual: 2 (of type int)
[ FAILED ] AirConditionerControllerTest.HeattingTest (0 ms)
[ RUN ] AirConditionerControllerTest.CoolingTest
[ OK ] AirConditionerControllerTest.CoolingTest (0 ms)
[----------] 3 tests from AirConditionerControllerTest (1 ms total)
[----------] Global test environment tear-down
[==========] 3 tests from 1 test suite ran. (1 ms total)
[ PASSED ] 2 tests.
[ FAILED ] 1 test, listed below:
[ FAILED ] AirConditionerControllerTest.HeattingTest
1 FAILED TEST
浅野 昌尚(あさの まさなお)
ガイオ・テクノロジー株式会社
開発1部 QTXグループ
1980年代から30年以上にわたり汎用構造のCコンパイラ開発に従事し、その間に8ビットマイコンからRISC・VLIW・画像処理プロセッサまで、さまざまなCPU向けのクロスCコンパイラを開発。