Как использовать реальную функцию в тесте, в котором используется объект с автопроводкой? - PullRequest
0 голосов
/ 03 апреля 2020

В моем коде я высмеиваю объект:

 @Mock
ElasticService elasticServiceMock;
@Autowired
ElasticConfiguration elasticConfiguration;

и я пытаюсь сделать тест:

@Test
public void measureChannelProcessor() throws IOException {
    when(elasticServiceMock.insert(anyString(),anyString())).thenAnswer(invocation -> {
        String index = (String) invocation.getArguments()[0];
        String message = (String) invocation.getArguments()[1];

        String requestUri = new StringBuilder()
                .append(elasticConfiguration.baseRequestBuilder(index))
                .toString();
}

, когда я вызываюasticConfiguration.baseRequestBuilder (index), у меня есть ноль.

реальный классasticConfiguration таков:

@Configuration
public class ElasticConfiguration {
@Autowired ElasticParameters elasticParameters;

public String baseRequestBuilder(String index){
    String toRet = new StringBuilder()
            .append(elasticParameters.getProtocol())
            .append("://")
            .append(elasticParameters.getHost())
            .append(":")
            .append(elasticParameters.getPort())
            .append("/")
            .append(index)
            .append("/")
            .append(elasticParameters.getType())
            .append("/")
            .toString();
    return toRet;
}

в частности, я хочу простой реальный классasticConfiguration, но

@Autowired
    ElasticConfiguration elasticConfiguration;

не работает! и у меня есть java .lang.NullPointerException.

вопрос в том, как использовать объект в тесте?

Также, если я использую @Mock ElasticConfigurationasticConfiguration;

У меня та же ошибка, но с отладкой я вижу, что @Autowired ElasticParameters

asticParameters; в публикации c класс ElasticConfiguration {имеет значение null.

Некоторые советы?

Спасибо

С уважением

1 Ответ

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

Если вам нужно @autowire объект, то вам требуется некоторая форма IO C контейнера , в вашем случае для Java, это, скорее всего, Spring.

Как правило, для того, чтобы Spring работал в соответствии с вашими тестами и автоматически подключал ваши bean-компоненты в нужное время, вам потребуются правильные аннотации, чтобы сообщить Spring, что делать, когда вы выполняете свой набор тестов.

@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration(classes = ElasticConfiguration.class)

Вы также должны включить любой класс конфигурации, содержащий определение компонента для ElasticParameters в приведенном выше выражении. Так это будет выглядеть так:

@ContextConfiguration(classes = {ElasticConfiguration.class, OtherConfiguration.class})

Кроме того, если вы используете component-scan в качестве средства автоматической конфигурации c bean-компонента, тогда вы можете просто объявить дополнительную аннотацию:

@ComponentScan(basePackages = "com.your.package.with.beans")

Как правило, когда мы используем контейнер IO C для запуска наших тестов, это тесты интеграции или выше в пирамиде тестирования. Модульные тесты не требуют этого.

Я бы посоветовал вам прочитать больше о написании интеграционных тестов здесь из документов Spring. Он охватывает все, что вам нужно знать, чтобы правильно выполнять тесты.

...