Questo è possibile farlo in due modi:
- con metodi personalizzati esecutore - creare una classe, con gli stessi metodi. E quindi utilizzare
Invoke()
per passare la chiamata a quell'oggetto
- utilizzando chiamata ordine parziale - creare aspettative diverse in diverse sequenze, come spiegato here
Con metodo personalizzato esecutore
Qualcosa di simile this:
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);
}
utilizzando chiamata ordine parziale
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();
}
fonte
2015-08-27 13:57:17
'EXPECT_CALL (API, doFoo (_)) volte (1);.' Opere? –
@ BЈовић Questo funziona fintanto che 'wrapper.foo()' chiama 'doFoo()', ma voglio testare anche se 'wrapper.foo()' non chiama 'doFoo()', a lungo come invece chiama 'doFooAndBar()'. – nemetroid