Jest to możliwe, aby zrobić na dwa sposoby:
- z metod niestandardowych wykonawca - utworzyć klasę, z tymi samymi metodami. A następnie użyć
Invoke()
przekazać wezwanie do tego obiektu
- z wykorzystaniem częściowego połączenia zamówienie - tworzyć różne oczekiwania w różnych sekwencjach, jak wyjaśniono here
metodą zwyczaj wykonawca
coś takiego to:
struct MethodsTracker {
void doFoo(int) {
++ n;
}
void doFooAndBar(int, int) {
++ n;
}
int n;
};
TEST_F(MyTest, CheckItInvokesAtLeastOne) {
MethodsTracker tracker;
Api obj(mock);
EXPECT_CALL(mock, doFoo(_)).Times(AnyNumber()).WillByDefault(Invoke(&tracker, &MethodsTracker::doFoo));
EXPECT_CALL(mock, doFooAndBar(_,_)).Times(AnyNumber()).WillByDefault(Invoke(&tracker, &MethodsTracker::doFooAndBar));
obj.executeCall();
// at least one
EXPECT_GE(tracker.n, 1);
}
użyciu częściowego połączenia kolejność
TEST_F(MyTest, CheckItInvokesAtLeastOne) {
MethodsTracker tracker;
Api obj(mock);
Sequence s1, s2, s3, s4;
EXPECT_CALL(mock, doFoo(_)).InSequence(s1).Times(AtLeast(1));
EXPECT_CALL(mock, doFooAndBar(_,_)).InSequence(s1).Times(AtLeast(0));
EXPECT_CALL(mock, doFoo(_)).InSequence(s2).Times(AtLeast(0));
EXPECT_CALL(mock, doFooAndBar(_,_)).InSequence(s2).Times(AtLeast(1));
EXPECT_CALL(mock, doFooAndBar(_,_)).InSequence(s3).Times(AtLeast(0));
EXPECT_CALL(mock, doFoo(_)).InSequence(s3).Times(AtLeast(1));
EXPECT_CALL(mock, doFooAndBar(_,_)).InSequence(s4).Times(AtLeast(1));
EXPECT_CALL(mock, doFoo(_)).InSequence(s4).Times(AtLeast(0));
obj.executeCall();
}
'EXPECT_CALL (API, doFoo (_)) razy (1).' Prace? –
@ BЈовић To działa tak długo, jak 'wrapper.foo()' wywołuje 'doFoo()', ale chcę przetestować, aby przejść, nawet jeśli 'wrapper.foo()' nie wywołuje 'doFoo()', tak długo jak jak nazywa 'doFooAndBar()' zamiast. – nemetroid