2017-12-13 1 views
-1

원시 이중 포인터를 가진 메소드를 모의합니다. 예를 들어 helper 클래스는 int run (int ** a) 메소드를가집니다. SetArgPointee를 사용하여 기대치를 설정하려하지만 작동하지 않습니다. 컴파일러 에러가 발생하면 int ** const를 int *로 변환 할 수 없습니다.인수로 double 포인터를 가진 함수를 모의합니다.

class Helper { 
    public: 
     MOCK_METHOD1(run, int(int ** a)); 
    }; 

    int** test = new int*[2]; 

    test[0] = new int[1]; 
    test[0][0] = 5; 

    test[1] = new int[1]; 
    test[1][0] = 55; 

    int** test2 = new int*[2]; 

    test2[0] = new int[1]; 
    test2[0][0] = 10; 

    test2[1] = new int[1]; 
    test2[1][0] = 110; 

    Helper helper; 
    EXPECT_CALL(helper, run(_)) 
     .Times(1) 
     .WillOnce(DoAll(SetArgPointee<0>(test2), Return(99))); 

    int rc = helper.run(test); 

테스트 이중 포인터를 test2로 바꿀 수 없습니다. 그것이 어떻게 행해지는지 알고 싶다.

+0

'도우미'란 무엇입니까? [MCVE] (https://stackoverflow.com/help/mcve)를보고 싶을 수도 있습니다. – Labonneguigue

+0

클래스 도우미 { public : MOCK_METHOD1 (run, int (int ** a)); }; – user3699160

+0

'벡터 '을 사용할 수 없습니까? – Labonneguigue

답변

0

이것은 완전한 대답은 아니지만 의견을 보내기에는 너무 길기 때문에 게시하겠습니다.

우선 무엇을 달성하려고하는지 설명해야합니다. 일반적으로 호출 된 모의 함수 인수를 설정하는 것은 정당화되지 않기 때문에 (적어도 수정 된 arg로 다른 작업을 수행하지 않으려는 경우). 이 메모리 포인터가 가리키는 때문에

SetArgPointee 만, 당신은 a[0]에서 값을 설정할 수 있습니다 : 그러나

int** mockInput1 = new int*[2]; 
int** mockInput2 = new int*[2]; 
EXPECT_CALL(helper, run(_)) 
    .Times(1) 
    // this will set value pointed by mockInput2[0] to mockInput1[0] 
    .WillOnce(DoAll(SetArgPointee<0>(mockInput1[0]), Return(99))); 
helper.run(mockInput2); 

, 나는 이것이 당신이 찾고있는없는 어떤 것을 거의 확신합니다. 당신이 당신의 전화가 일치 한 후 호출 할 수있는 사용자 정의 작업을 정의 할 수 있다는 gmock 참고 : 당신은 당신이 원하는대로 할 수있는 작업을 내부

auto action = [](int** a) { 
    int** test = new int*[2]; 
    test[0] = new int[1]; 
    test[0][0] = 5; 
    test[1] = new int[1]; 
    test[1][0] = 55; 
    a[0] = test[0]; 
    a[1] = test[1]; // or whatever 
    std::cout << "Executed custom action" << std::endl; 
}; 
EXPECT_CALL(helper, run(_)) 
    .Times(1) 
    .WillOnce(DoAll(Invoke(action), Return(99))); 
helper.run(mockInput2); 

합니다. 어쨌든, 실제로 무엇을 달성하려고하는지 설명하십시오.

또한 메모리를 적절하게 삭제하지 않으면 메모리 누출 가능성이 없습니다.

관련 문제