GMock:未按预期调用EXPECT_CALL文件*

时间:2016-01-08 17:41:27

标签: c++ gmock

我正在尝试这个例子而且except_call不满足,因为它在下面,但如果我不提供任何参数,同样的事情也有效 -

EXPECT_CALL(fio, Open(_, _))
  .WillOnce(Return(test_file));
EXPECT_CALL(fio, Write(_, _, _, test_file))
    .WillOnce(Return(sizeof(data)));
EXPECT_CALL(fio, Close(test_file))
  .WillOnce(Return(0));

任何帮助表示感谢,谢谢!! 我发布了“我收到的错误消息”

以下是整个代码。

//Interface

#include <cstdio>
#include <cstddef>


class IFileInputOutput {
public:
  virtual ~IFileInputOutput() {}

  virtual FILE* Open(const char* filename, const char* mode) = 0;
  virtual size_t Write(const void* data, size_t size, size_t num, FILE* file) = 0;
  virtual int Close(FILE* file) = 0;
};


//Implementation
#include <cstdio>

#include "IFileInputOutput.h"

class ImplFileInputOutput : public IFileInputOutput {
public:

  ImplFileInputOutput() {}

  virtual ~ImplFileInputOutput() {}

  virtual FILE* Open(const char* filename, const char* mode) {
      return fopen(filename, mode);
  }

  virtual size_t Write(const void* data, size_t size, size_t num, FILE* file) {
      return fwrite(data, size, num, file);
  }


  virtual int Close(FILE* file) {
      return fclose(file);
  }
};

//class under test Writer.h

#include "IFileInputOutput.h"


class Writer {
public:
    Writer(IFileInputOutput &objfile);
    virtual ~Writer();
    bool WriteBlog(const char* filename, const void* data, size_t size);
    //void WriteNovel();

private:
    IFileInputOutput &objFileInputOutput;
};

//Writer.cpp
#include "Writer.h"



Writer::Writer(IFileInputOutput &objfile):objFileInputOutput(objfile) { }

Writer::~Writer() { }

// Writes a file, returns true on success.
bool Writer::WriteBlog(const char* filename, const void* data, size_t size) {


   FILE* file = objFileInputOutput.Open(filename, "w+");

   if (!file) {
     return false;
   }

   if (objFileInputOutput.Write(data, 1, size, file) != size) {   
     return false;
   }

   if (objFileInputOutput.Close(file) != 0) {
   //if (obj.Close(file) != 0) {
     return false;
   }

   return true;
}

//Mock class
#include <cstddef>
#include <cstdio>

#include <gmock/gmock.h>

#include "IFileInputOutput.h"

class FileInputOutputMock : public IFileInputOutput {

public:

  MOCK_METHOD2(Open, FILE*(const char * filename, const char* mode));
  MOCK_METHOD4(Write, size_t(const void* data, size_t size, size_t num, FILE* file));
  MOCK_METHOD1(Close, int(FILE* file));

};


//Tests



class FileInputOutputTest : public ::testing::Test
{
public:
    void SetUp(){};
    void TearDown(){};

    FileInputOutputTest(){};
    virtual ~FileInputOutputTest(){};


};


TEST_F(FileInputOutputTest, SuccessWorks) {

   FileInputOutputMock fio;
   Writer _objWriter(fio);

  static char data[] = "hello";
  const char* kName = "test.txt";

  FILE* test_file;

    EXPECT_CALL(fio, Open(kName, "w+"))
      .WillOnce(Return(test_file));
    EXPECT_CALL(fio, Write(&data, 1, sizeof(data), test_file))
        .WillOnce(Return(sizeof(data)));
    EXPECT_CALL(fio, Close(test_file))
      .WillOnce(Return(0));


  bool ret = _objWriter.WriteBlog(kName, &data, sizeof(data));

  EXPECT_EQ(true, ret);
}


Error

 * [----------] 1 test from FileInputOutputTest
[ RUN      ] FileInputOutputTest.SuccessWorks
unknown file: Failure

Unexpected mock function call - returning default value.
    Function call: Open(0x47a829 pointing to "test.txt", 0x47ec23 pointing to "w+")
          Returns: NULL
Google Mock tried the following 1 expectation, but it didn't match:

../test/Unit/FileInputOutputTest.cpp:58: EXPECT_CALL(fio, Open(kName, "w+"))...
  Expected arg #1: is equal to 0x47a832 pointing to "w+"
           Actual: 0x47ec23 pointing to "w+"
         Expected: to be called once
           Actual: never called - unsatisfied and active
../test/Unit/FileInputOutputTest.cpp:77: Failure
Value of: ret
  Actual: false
Expected: true
../test/Unit/FileInputOutputTest.cpp:62: Failure
Actual function call count doesn't match EXPECT_CALL(fio, Close(test_file))...
         Expected: to be called once
           Actual: never called - unsatisfied and active
../test/Unit/FileInputOutputTest.cpp:60: Failure
Actual function call count doesn't match EXPECT_CALL(fio, Write(&data, 1, sizeof(data), test_file))...
         Expected: to be called once
           Actual: never called - unsatisfied and active
../test/Unit/FileInputOutputTest.cpp:58: Failure
Actual function call count doesn't match EXPECT_CALL(fio, Open(kName, "w+"))...
         Expected: to be called once
           Actual: never called - unsatisfied and active
[  FAILED  ] FileInputOutputTest.SuccessWorks (1 ms)

1 个答案:

答案 0 :(得分:1)

此错误的原因是函数Open的参数类型为char *,所以何时 你指定要匹配的参数,实际上是在请求匹配指针。以来 您已在测试体内创建了第一个请求的参数kName并将其传递给 函数,该指针是否正确匹配(请注意,虽然此检查通过,但事实并非如此 匹配字符串文字的正确方法)。但是,当匹配第二个参数时,你就是 实际上匹配测试体和另一个中定义的字符串文字的第一个元素的地址 一个在函数内定义的。虽然他们指向相同的字符串文字,但这些是 两个不同的地址,这就是匹配失败的原因。

要正确匹配字符串文字,请使用StrEq中的gmock匹配器。这是你如何做到的:

EXPECT_CALL(fio, Open(StrEq(kName), StrEq("w+")))
    .WillOnce(Return(test_file));