Конструктор Mocking класса внутри метода PowerMock Mockito - PullRequest
1 голос
/ 07 марта 2020

Я столкнулся с проблемой, пытаясь смоделировать класс с помощью PowerMock. Прежде всего, вот мои текущие зависимости gradle:

testCompile group: 'junit', name: 'junit', version: '4.12'
testCompile "org.mockito:mockito-core:2.+"
testCompile group: 'org.powermock', name: 'powermock-module-junit4', version: '2.0.2'
testCompile group: 'org.powermock', name: 'powermock-api-mockito2', version: '2.0.2'

Я пытаюсь смоделировать вызовы брокеру kafka. Код выглядит примерно так:

public class MyConsumer {
    public Consumer<Long, String> createConsumer() {
        ...
        Consumer<Long, String> consumer = new KafkaConsumer<>(props);
        consumer.subscribe(TOPIC);
        ....
    }
}

Эти две строки в createConsumer - все, что я пытаюсь высмеять. Мой тест выглядит примерно так:

@RunWith(PowerMockRunner.class)
@PrepareForTest(MyConsumer.class)
public class MyConsumerTest {

    @Test
    public void testCreateConsumer() {
        ...
        KafkaConsumer mockConsumer = mock(KafkaConsumer.class);
        doNothing().when(mockConsumer).subscribe(TOPIC);
        PowerMockito.whenNew(KafkaConsumer.class).withAnyArguments().thenReturn(mockConsumer);

        Consumer<Long, String> result = myConsumerInstance.createConsumer();
        ...
    }
}

Когда я пытаюсь запустить тесты, они никогда не запускаются, и я получаю эту ошибку:

> Task :compileTestJava FAILED
/Users/myuser/myproject/src/test/java/myConsumerTest.java:101: error: unreported exception Exception; must be caught or declared to be thrown
       PowerMockito.whenNew(KafkaConsumer.class).withAnyArguments().thenReturn(mockConsumer);
                                                                 ^
Note: /Users/myuser/myproject/src/test/java/myConsumerTest.java uses or overrides a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
Note: /Users/myuser/myproject/src/test/java/myConsumerTest.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
1 error

FAILURE: Build failed with an exception.

Так что я решил, что оберну попытаться получить больше информации о том, что пошло не так. Когда я это сделал, тесты запустились, но этот конкретный c тест не удался, выдав эту ошибку:

Kafka.analyticsConsumerTest > testCreateConsumer FAILED
    java.lang.RuntimeException at PowerMockTestNotifierImpl.java:84
        Caused by: org.mockito.exceptions.base.MockitoException at MethodRoadie.java:87

Я так и не понял, как извлекать больше информации из Это. Кто-нибудь сталкивался с чем-то подобным?

Моя текущая рабочая теория связана с тем, как класс KafkaConsumer возвращает Consumer? Потребитель в этом случае - org.apache.kafka.clients.consumer.Consumer. Возможно я не издеваюсь это правильно? Любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 07 марта 2020

Спасибо за предложение, но если вы перечитали выше, я уже сделал это. Вот как я получил исключение Runtime. Если только я неправильно понимаю, что вы имеете в виду?

Может, вам что-то не хватает? Проверьте приведенный ниже пример, он работает для меня.

Gradle:

dependencies {

    testCompile group: 'junit', name: 'junit', version: '4.12'
    testCompile "org.mockito:mockito-core:2.+"
    testCompile group: 'org.powermock', name: 'powermock-module-junit4', version: '2.0.2'
    testCompile group: 'org.powermock', name: 'powermock-api-mockito2', version: '2.0.2'

    compile group: 'org.apache.kafka', name: 'kafka-clients', version: '2.4.0'
}

Модульный тест:

import java.util.Arrays;
import java.util.Collection;
import java.util.Properties;

import org.apache.kafka.clients.consumer.Consumer;
import org.apache.kafka.clients.consumer.KafkaConsumer;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;

@RunWith(PowerMockRunner.class)
@PrepareForTest(MyConsumerTest.MyConsumer.class)
public class MyConsumerTest {

    private static final Collection<String> TOPIC = Arrays.asList("1");

    static class MyConsumer {

        public Consumer<Long, String> createConsumer() {

            Properties props = new Properties();
            Consumer<Long, String> consumer = new KafkaConsumer<>(props);
            consumer.subscribe(TOPIC);

            return consumer;
        }
    }

    @Test
    public void testCreateConsumer() throws Exception {

        KafkaConsumer<?,?> mockConsumer = PowerMockito.mock(KafkaConsumer.class);
        PowerMockito.doNothing().when(mockConsumer).subscribe(TOPIC); // default behaviour, line is not required
        PowerMockito.whenNew(KafkaConsumer.class).withAnyArguments().thenReturn(mockConsumer);

        MyConsumer myConsumerInstance = new MyConsumer();
        Consumer<Long, String> result = myConsumerInstance.createConsumer();

    }
}
...