【问题标题】:How to solve gmock EXPECT_CALL failure, when variable passed to function doesn't matter当变量传递给函数无关紧要时,如何解决 gmock EXPECT_CALL 失败
【发布时间】:2017-04-06 19:55:14
【问题描述】:

我让EXPECT_CALL 通过了我的测试,直到我添加了一个标头来包装我正在测试的unsigned char *。我知道测试正在下降,因为它与预期的 unsigned char * 不同。我只是不确定如何重新设计我的测试,所以分配给的 unsigned char * 会导致测试通过。

我的测试(省略了变量的初始化):

EXPECT_CALL(networkConnectionMock, Transmit(packetData, dataSize));

packetManager.Update(0.01f);
packetManager.Send(packetData, dataSize);

被测函数:

void PacketManager::Send(unsigned char *packetData, int packetSize)
{
    if(this->secondSinceLastUpdate <= 1.0f)
        packetsSent++;
    else
    {
        packetsSent = 0;
        this->secondSinceLastUpdate = 0.0f;
    }

    std::stringstream convert;
    convert << htonl((uint32_t)packetSize);
    Header *header = new Header;
    header->name = "PKT_" + convert.str();
    header->packetSize = packetSize;
    header->packetData = packetData;
    unsigned char * pktHeader = new unsigned char[sizeof(Header)];
    pktHeader = (unsigned char*)header;
    PKT_Header = pktHeader; // tried assigning to public variable, 
                           // but would be assigned to after EXPECT_CALL is setup.
    int totalPacketSize = packetSize; // rewrite to loop through que
    if(header->packetSize <= 800 && totalPacketSize <= 1024 && packetsSent <= 30)
        networkConnection->Transmit(pktHeader, packetSize);
}

模拟输出:

[==========] Running 1 test from 1 test case.
[----------] Global test environment set-up.
[----------] 1 test from PacketManager
[ RUN      ] PacketManager.SendsPacketsUnder1024
unknown file: Failure

Unexpected mock function call - returning directly.
    Function call: Transmit(0x2096c10, 100)
Google Mock tried the following 1 expectation, but it didn't match:

/home/zerophase/ClionProjects/PacketManager/tests/basic_tests/basic_check.cpp:20: EXPECT_CALL(networkConnectionMock, Transmit(packetData, dataSize))...
  Expected arg #0: is equal to 0x2096560
           Actual: 0x2096c10
         Expected: to be called once
           Actual: never called - unsatisfied and active
/home/zerophase/ClionProjects/PacketManager/tests/basic_tests/basic_check.cpp:20: Failure
Actual function call count doesn't match EXPECT_CALL(networkConnectionMock, Transmit(packetData, dataSize))...
         Expected: to be called once
           Actual: never called - unsatisfied and active
[  FAILED  ] PacketManager.SendsPacketsUnder1024 (0 ms)
[----------] 1 test from PacketManager (0 ms total)

[----------] Global test environment tear-down
[==========] 1 test from 1 test case ran. (0 ms total)
[  PASSED  ] 0 tests.
[  FAILED  ] 1 test, listed below:
[  FAILED  ] PacketManager.SendsPacketsUnder1024

EXPECT_CALL 仍然是我想用来测试 Transmit 被调用的吗?

【问题讨论】:

  • 请附上google mock的相关输出。
  • @AntonioPérez 我添加了 gmock 输出。

标签: c++ c googletest gmock


【解决方案1】:

如果您并不真正关心传递给Transmit 的确切参数,那么您可以使用_ 关键字。

EXPECT_CALL(networkConnectionMock, Transmit(_, dataSize));

如果您确实关心确切的参数,那么我会稍微重新排列我的代码,这样我就不会将原始unsigned char* 传递到Send,而是创建一个简单的类来完成您在@ 中所做的工作987654326@ 并让该类负责返回 unsigned char*

这样您就可以将一个模拟对象传递给您的Send 方法,从而让您更好地控制传递给Trasmit 的参数。

【讨论】:

  • 谢谢,这对开发代码最有意义。我实际上并没有考虑这样做。我想我只需要将其转换为 unsigned char * 即可传递发送方法。
【解决方案2】:

您正在尝试将Transmit 的调用与packetData 作为第一个参数相匹配,但在PacketManager::Send 中进行的调用是针对pktHeader,这是一个(泄漏的)局部变量。模拟正确地报告了不匹配的函数调用,并且还必须报告 uninteresting function call 的警告。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-06
    • 1970-01-01
    • 2016-04-25
    • 2018-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多