Как заглушить метод, возвращающий void

Надеюсь, мой вопрос не слишком простой, так как я новичок в obj-c и OCMockito!

У меня есть метод void, который я хочу заглушить, чтобы он не выполнял свои действия при запуске теста.

Мой метод:

-(void)myVoidMethod { .. }

Я хотел бы заглушить его примерно так:

[данный ([mockDataManager saveChangesToCoreData])];

Однако, если я не укажу оператор willReturn, я получу следующую ошибку: "Тип аргумента 'void' неполный"

Как я могу добиться этого в OCMockito?


person edoDev    schedule 29.05.2014    source источник
comment
Можете ли вы объяснить ваш случай больше. Почему вы хотите заглушить метод void?   -  person Eugen Martynov    schedule 02.06.2014
comment
Я хотел бы предотвратить запуск внутренностей (функциональности) этого конкретного метода. Метод, который я хотел бы заглушить, вызывается из метода, который я тестирую, но я не хотел бы выполнять инструкции внутри него. Имеет ли это смысл?   -  person edoDev    schedule 04.06.2014
comment
В общем, я бы избегал частичной заглушки. Это хороший запах, что дизайн не правильный.   -  person Eugen Martynov    schedule 04.06.2014
comment
Некоторые решения можно найти здесь: github.com/jonreid/OCMockito/issues/38   -  person Eugen Martynov    schedule 04.06.2014


Ответы (2)


Получив более подробную информацию из комментариев, я решил написать ответ здесь.

Частичная заглушка IMO (шпионы) - плохая практика. Я использовал его два раза в действительно большом устаревшем проекте, и в какой-то момент я хотел бы изменить его на что-то более чистое.

Такое же мнение разделяют и другие люди. В качестве быстрого решения вы можете последовать совету здесь - создать подкласс и переопределить метод.

person Eugen Martynov    schedule 04.06.2014

Объявление фиктивного протокола, в котором этот метод объявлен как возвращающий идентификатор, исправит ошибку компиляции.

@protocol _dummyProtocol
    - (id)methodThatReallyReturnVoid;
@end

[[(id<_dummyProtocol>)[mockObject stub] methodThatReallyReturnVoid] andDo:^(NSInvocation *inv){}];
person Oleksiy Ivanov    schedule 16.08.2016