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コンパイラを開発。
 
                        						 
                        						 
                        						 
                        						 
                        						 
                        						