我有一個在初始化串列中呼叫模擬函式的類。我想使用 EXPECT_CALL 來驗證模擬函式是否只被呼叫一次。問題是我不能在建構式之前使用宏,因為它是第一個運行的函式,也不能在它之后使用,因為在建構式中呼叫了模擬函式。
例如: ui.cpp
class UI {
public:
UI() = default;
~UI() = default;
virtual std::string get_name() {
std::string name;
std::cin >> name;
return name;
}
};
foo.cpp檔案
class Foo {
public:
Foo(UI& ui) : m_name(ui.get_name()) {}
~Foo() = default;
};
mock_ui.hpp
class MockUI : public UI {
MockUI() : UI() = default;
~MockUI() = default;
MOCK_METHOD(std::string, get_name, (), (override));
};
問題出現在這里: foo_test.cpp
class FooTest : ::testing::Test {
public:
// I want to call EXPECT_CALL(m_ui, get_name()) before this line executes.
FooTest() : m_foo(MockUI()) {}
~FooTest() = default;
protected:
void SetUp() override {}
void TearDown() override {}
Foo m_foo;
MockUI m_ui;
};
我嘗試Foo在函式中初始化物件SetUp(),但 Foo 沒有默認建構式,因此必須在FooTest建構式中對其進行初始化。
解決方案?
我唯一的想法是EXPECT_CALL()像這樣呼叫 MockUI 建構式:
mock_ui.hpp
class MockUI : public UI {
MockUI() : UI() {
EXPECT_CALL(*this, get_name());
}
~MockUI() = default;
MOCK_METHOD(std::string, get_name, (), (override);
};
問題是我可能會在不呼叫的情況下使用 MockUIget_name()或多次呼叫它的情況下使用 MockUI,但這是我擁有的最佳解決方案。
還有其他建議嗎?
uj5u.com熱心網友回復:
Foo您可以使用指標延遲初始化:
class FooTest : ::testing::Test {
public:
FooTest()
{
EXPECT_CALL(m_ui, get_name());
m_foo = std::make_unique<Foo>(m_ui);
}
protected:
std::unique_ptr<Foo> m_foo;
MockUI m_ui;
};
或者通過添加一個將首先初始化的父類MockUI:
class FooTestHelper: public ::testing::Test
{
public:
FooTestHelper() { EXPECT_CALL(m_ui, get_name()); }
protected:
MockUI m_ui;
};
class FooTest : public FooTestHelper
{
public:
FooTest(): FooTestHelper{}, m_foo{m_ui} {}
private:
Foo m_foo;
};
uj5u.com熱心網友回復:
您還可以在虛擬變數的初始化中添加 EXPECT_CALL:
class FooTest : ::testing::Test {
public:
FooTest() {}
~FooTest() = default;
protected:
void SetUp() override {}
void TearDown() override {}
MockUI m_ui;
bool dummy = (EXPECT_CALL(m_ui, get_name()), true);
Foo m_foo{m_ui};
};
我移動了 的初始化m_foo,但它只是為了更好地了解初始化順序,您可以將其留在建構式中。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/537134.html
標籤:C 谷歌测试谷歌模拟
