Mockito - шпионаж на нескольких зависимостях - PullRequest
0 голосов
/ 29 апреля 2020

Можно ли внедрить шпиона для двух зависимостей в тестируемый класс? У меня есть этот класс:

@Service
@Singleton
@MessageReceiver
public class LinkHitCallbackEventHandler {
    public static final Logger logger = LogManager.getLogger();

    @Inject
    private CallbackInvocationBuilder callbackInvocationBuilder;

    @Inject
    private CallbackLogBuilder callbackLogBuilder;

    @MessageReceiver
    public void handle(@SubscribeTo LinkHitEvent event) {
        Entity<Form> entity = EntityFormFactory.createFromEvent(event);

        this.callbackLogBuilder.build(entity);

        Response response = this.callbackInvocationBuilder.post(entity);
    }
}

Важно, что это простой класс с двумя внедренными зависимостями: callbackInvocationBuilder и callbackLogBuilder .

Я тестирую вызовы к этим зависимостям следующим образом:

    @Test
    public void send_callback_after_event_is_published() {
        target("/testY")
                .property("jersey.config.client.followRedirects", false)
                .request()
                .header("User-Agent", UserAgentMother.allowedUserAagent())
                .get();

        verify(callbackInvocationBuilder).post(anyObject());
//        verify(callbackLogBuilder).build(anyObject());
    }

Это соглашение проходит тест, потому что я сначала вызываю callbackLogBuilder.build(entity).

Если я поменяю местами вызовы и сначала вызову их callbackInvocationBuilder.post(entity), тест не пройден.

И callbackLogBuilder, и callbackInvocationBuilder являются шпионами. Я настраиваю их в configure () из JerseyTest. Точно так же.

1 Ответ

0 голосов
/ 29 апреля 2020

Один из способов внедрить шпиона для использования whitebox и использовать подтверждение

следующим образом:

Whitebox.setInternalState(ClassToTest.class, "Object", spy1);

, поэтому метод испытаний будет таким:

    @Test
    public void send_callback_after_event_is_published() {
        Whitebox.setInternalState(LinkHitCallbackEventHandler.class, "callbackInvocationBuilder", spy1);
        Whitebox.setInternalState(LinkHitCallbackEventHandler.class, "callbackInvocationBuilder", spy2);

        target("/testY")
                .property("jersey.config.client.followRedirects", false)
                .request()
                .header("User-Agent", UserAgentMother.allowedUserAagent())
                .get();

        verify(callbackInvocationBuilder).post(anyObject());
        verify(callbackLogBuilder).build(anyObject());
    }

, если вы хотите захватить аргумент

ArgumentCaptor<Entity> captor = ArgumentCaptor.forClass(Entity.class);
verify(callbackInvocationBuilder, times(1)).post(captor.capture());

Entity actualEntity = captor.getValue();
assertEquals(expected, actualEntity);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...