ez8-co / emock

🐞 下一代C/C++跨平台mock库 (Next generation cross-platform mock library for C/C++)
Apache License 2.0
118 stars 35 forks source link

连续mock两个不同的类内普通方法,发现走的同一个will() #26

Closed huso1101 closed 2 years ago

huso1101 commented 2 years ago
class BaseFoo {
public: 
    int GetValue() {return 10;}
    int GetValue2() {return 20;}
};

TEST(emockTest, test0)
{
    FooA fooA;
    BaseFoo baseFoo;
    EMOCK(&BaseFoo::GetValue2).stubs().will(returnValue(2));
    EMOCK(&BaseFoo::GetValue).stubs().will(returnValue(1));
    std::cout<<"=== emockTest: "<<baseFoo.GetValue2()<<" "<<baseFoo.GetValue()<<std::endl;
}

你好,我像上边这样写打印得到的是=== emockTest: 1 1 我的编译环境是Visual Studio 15 2017 使用的是c++ 11 的标准set(CMAKE_CXX_STANDARD 11) 我单步调试看了一下,调用函数时,

// \\include\\emock\\\HookMockObject.h
    template <typename RT>
    ChainableMockMethod<RT> invoke(const void* api) 
    {
      return ChainableMockMethod<RT>(getInvokable(api)); 
    }

这里的api每次都是同一个,都是最后用EMOCK设置的函数的地址。

单步调试时中间有几步提示加载的模块中为找到当前堆栈 然后就到EMOCK_API_HOOK_FUNCTOR_DEF(1); 后边就。。没太看懂,,我是希望找到invoke里的api是在哪传入的,为什么两次都传入相同的。 希望大佬帮忙看看,thanks。

huso1101 commented 2 years ago

你好,我发现这两个函数,在ApiHook::ApiHook()构造的时候 api 与stub不同,但trampoline却是同样的值。

huso1101 commented 2 years ago

你好,,我找到原因了,,getTrampoline函数里,计算使用的空间it->used时,,ceil(alloc_size / kAlignmentSize)需要改为ceil((double)alloc_size / kAlignmentSize),除数被除数都是整数类型。修改后mock结果正常。

orca-zhang commented 2 years ago

好的,太感谢了,我提交一下patch