gmock - установка ожиданий для одного и того же объекта с одинаковыми параметрами в разных методах

avatar
DeSubstantiisSeparatis
9 августа 2021 в 06:47
157
0
0

Допустим, что класс TEST содержит достаточно большую логику, поэтому для каждого UT мне нужно установить много ожиданий для фиктивных классов, используемых в классе TEST. У каждого UT будут свои ожидания, но некоторые из них совпадают. Поэтому, имея много UT для класса TEST, я хотел бы перенести некоторые ожидания на другой метод, чтобы код UT был более читабельным:

class SetUpClass
{
    ClassAMock // let's assume that it's testing::NiceMock for some class A
    void SetSomeExpectations() //because most/all tests cases will need that expectation let's put it here 
    {
        EXPECT_CALL(ClassAMock, SomeMethod()).Times(1);
    }
}

(SomeTest, SetUpClass)
{
    // preparing expectations
    // below one is generic
    SetSomeExpectations();

    // but this test needs additional expectations for ClassAMock SomeMethod
    EXPECT_CALL(ClassAMock, SomeMethod()).Times(2);

    // Run tests
    ...
}

Итак, чего я хотел бы добиться, так это иметь возможность суммировать эти ожидания, поэтому, наконец, gmock ожидает, что SomeMethod будет вызван 3 раза. Это вообще возможно? Ничего похожего в инете не нашел. Кажется, что каждый вызов Times переопределяет предыдущий, а не суммирует их.

Источник
Bart
9 августа 2021 в 07:34
0

Вы смотрели / пробовали тестовые приборы? github.com/google/googletest/blob/master/docs/…

DeSubstantiisSeparatis
9 августа 2021 в 12:02
0

@Bart Да, SetUpClass - это класс тестовых приспособлений. Он не наследуется от :testing::Test, потому что я использую инфраструктуру ускоренного тестирования для тестирования, а gmock для установки ожиданий и gmocks. И, как я показал в примере, вызов SetSomeExpectations из класса тестовых приспособлений не работает, поскольку ожидания, установленные в SomeTest, перекрывают его.

Bart
9 августа 2021 в 12:52
0

Они отменяют или не заботятся о порядке? По умолчанию gmock не заботится о том, в каком порядке вызываются макеты. Я часто использую InSequence seq, но это определенно класс с ограниченной областью действия, который работает только в той же области. Действительно уродливым хаком было бы использование макроса :-(

DeSubstantiisSeparatis
10 августа 2021 в 06:23
0

Ну, они переопределяют вызовы для ожиданий, поэтому, когда я вызываю один файл EXPECT_CALL(ClassAMock, SomeMethod()).Times(1); EXPECT_CALL(ClassAMock, SomeMethod()).Times(2); gmock будет ожидать, что SomeMethod будет вызван 2 раза, а не 3.

Bart
10 августа 2021 в 06:31
0

Вам нужно знать, что макет случается? Если нет, вы можете их не использовать, если у вас нет побочных эффектов, таких как возвращаемые значения или ожидаемые параметры. Я использую макеты, в которых у меня разные значения параметров, и я могу складывать их без проблем, но все они находятся в одной области. пример: github.com/Embedded-AMS/EmbeddedProto/blob/master/test/…

DeSubstantiisSeparatis
10 августа 2021 в 07:47
0

Я хочу иметь контроль над всеми макетами, поэтому мне нужно справиться со всеми ожиданиями. Без этого я не вижу особого смысла в использовании gmocks, если я не использую ожидания для mocks... Я вижу, что Times() возвращает объект, но все же я не вижу никаких вариантов для управления параметром times. Я предполагаю, что это не поддержка, и это все история. У меня может быть какая-то локальная переменная, которую я изменю, и в конце я перейду к Times(), но это довольно уродливое решение.

Ответы (0)