2013-06-21 4 views
7

У меня есть класс, который принимает логическое значение в качестве опорного параметра и возвращает целое число:Google издеваться ByRef метод

class Foo 
{ 
    public: 
    Bar my_bar; 
    virtual int myMethod(bool &my_boolean) = 0; 
} 

/*...*/ 

int Foo::myMethod(bool &my_boolean){ 
    if (my_bar == NULL){ 
    my_boolean = false; 
    return -1; 
    } 
    else{ 
    my_boolean = true; 
    return 0; 
    } 

} 

И я создал макет для этого класса:

class MockFoo : public Foo 
{ 
    MOCK_METHOD1(myMethod,int(bool &my_boolean)); 
} 

Я имея проблемы с тем, как установить ожидания для такого типа функции, потому что мне нужно установить возвращаемое значение и ссылочным параметром для определенных значений, чтобы правильно создать мои модульные тесты. Как я могу справиться с этой функцией с помощью gmock? Я пробовал следовать тому, что я думал как решение по документации:

using ::testing::SetArgPointee; 

class MockMutator : public Mutator { 
    public: 
    MOCK_METHOD2(Mutate, void(bool mutate, int* value)); 
    ... 
}; 
    ... 

MockMutator mutator; 
EXPECT_CALL(mutator, Mutate(true, _)) 
    .WillOnce(SetArgPointee<1>(5)); 

Но или я не понял пример или это не применимо для этого никому case.Has дело ти такой ситуации раньше?

Заранее спасибо.

+0

Тогда я не понимаю, в чем ваш вопрос. Можете ли вы рассказать о своих проблемах? Код кажется правильным для меня. Или вы хотите знать, как установить ожидания для эталонного параметра аналогично? 'ByRef()' было бы отлично для этого. –

+0

+1 Это трудно получить из примеров повара. –

ответ

6

Ваш вопрос трудно получить! Образцы из кулинарной книги google mocks так же хорошо.

Вы хотите повторно использовать реализацию для Foo::myMethod() с вашим классом макета или просто хотите высмеять побочные эффекты (возвращаемое значение и измененные параметрами ref) для конкретных ситуаций вызова?

Класс макета обычно предназначен для замены/моделирования вашего класса Foo, а не наследования его напрямую или его поведения. Не знаю, будет ли способ, которым вы определяете это поведение по умолчанию для чистого метода, будет работать, но сомневайтесь в этом. Тогда вы можете просто опустить = 0. подход лучше бы отделить реальное объявление интерфейса, как:

struct IFoo 
{ 
    virtual int myMethod(bool &my_boolean) = 0; 
    virtual ~IFoo() {} 
}; 

class Foo : public IFoo 
{ 
    // ... 
}; 

class MockFoo : public IFoo 
{ 
    MOCK_METHOD1(myMethod,int(bool &my_boolean)); 
}; 

Если у вас есть последний случай, вы должны выйти с testing::Return(value) и testing::SetArgReferee<N>(value) (установлено, что в очень полезный 'Cheat Sheet').

Ваше ожидание вызова должен выглядеть следующим образом, то:

MockFoo foo; 

// Expect call to myMethod() return -1 and set the by ref argument to true 
EXPECT_CALL(foo, myMethod(_)) 
    .WillOnce(DoAll(SetArgReferee<0>(true),Return(-1))); 

// Expect call to myMethod() return 0 and set the by ref argument to false 
EXPECT_CALL(foo, myMethod(_)) 
    .WillOnce(DoAll(SetArgReferee<0>(false),Return(0))); 

Если вы действительно хотите использовать исходный классы логики для myMethod() взглянуть на 'Delegating calls to a parent class', соответственно. 'Delegating Calls to a Real Object'

+0

Извините @ g-makulik У меня был скопирован неправильный код-фрагмент, этот вопрос не был связан с этим вопросом. Теперь я исправил его. –

+0

Извините, мне потребовалось немного времени, чтобы выяснить вашу проблему. 'ByRef()' был ложным путем для этого случая. –

+0

@RodrigoVasconcelos Больше не интересует? Решает ли это ваши проблемы? –