Допустим, что класс 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 переопределяет предыдущий, а не суммирует их.
Вы смотрели / пробовали тестовые приборы? github.com/google/googletest/blob/master/docs/…
@Bart Да, SetUpClass - это класс тестовых приспособлений. Он не наследуется от :testing::Test, потому что я использую инфраструктуру ускоренного тестирования для тестирования, а gmock для установки ожиданий и gmocks. И, как я показал в примере, вызов SetSomeExpectations из класса тестовых приспособлений не работает, поскольку ожидания, установленные в SomeTest, перекрывают его.
Они отменяют или не заботятся о порядке? По умолчанию gmock не заботится о том, в каком порядке вызываются макеты. Я часто использую
InSequence seq
, но это определенно класс с ограниченной областью действия, который работает только в той же области. Действительно уродливым хаком было бы использование макроса :-(Ну, они переопределяют вызовы для ожиданий, поэтому, когда я вызываю один файл EXPECT_CALL(ClassAMock, SomeMethod()).Times(1); EXPECT_CALL(ClassAMock, SomeMethod()).Times(2); gmock будет ожидать, что SomeMethod будет вызван 2 раза, а не 3.
Вам нужно знать, что макет случается? Если нет, вы можете их не использовать, если у вас нет побочных эффектов, таких как возвращаемые значения или ожидаемые параметры. Я использую макеты, в которых у меня разные значения параметров, и я могу складывать их без проблем, но все они находятся в одной области. пример: github.com/Embedded-AMS/EmbeddedProto/blob/master/test/…
Я хочу иметь контроль над всеми макетами, поэтому мне нужно справиться со всеми ожиданиями. Без этого я не вижу особого смысла в использовании gmocks, если я не использую ожидания для mocks... Я вижу, что Times() возвращает объект, но все же я не вижу никаких вариантов для управления параметром times. Я предполагаю, что это не поддержка, и это все история. У меня может быть какая-то локальная переменная, которую я изменю, и в конце я перейду к Times(), но это довольно уродливое решение.