Mockito: нулевое взаимодействие с этим макетом - PullRequest
1 голос
/ 25 июня 2019

У меня есть класс, который я хотел бы проверить.

@Configuration
@Import(EmailageConfiguration.class)
public class EmailageServiceConfiguration {

    private static final String EMAILAGE_ACCOUNT_ID_CONFIG_KEY = "emailage.key";
    private static final String EMAILAGE_API_KEY_CONFIG_KEY = "emailage.secret";

    @Bean
    public EmailageConfigHolder emailageConfigHolder(Environment env) {

        final EmailageConfigHolder holder = new EmailageConfigHolder();

        holder.setApiKey(env.getRequiredProperty(EMAILAGE_API_KEY_CONFIG_KEY));
        holder.setAccountId(env.getRequiredProperty(EMAILAGE_ACCOUNT_ID_CONFIG_KEY));

        return holder;
    }

}

Мой тестовый класс предоставлен,

@RunWith(MockitoJUnitRunner.class)
public class EmailageServiceConfigurationTest {

    @InjectMocks
    private EmailageServiceConfiguration configuration;

    @Mock
    private Environment environment;

    @Mock
    private EmailageConfigHolder holder;

    @Test
    public void testEmailageConfigHolder() {

        when(environment.getRequiredProperty(anyString())).thenReturn(anyString());

        configuration.emailageConfigHolder(environment);

        verify(holder, times(1)).setApiKey(anyString());
        verify(holder, times(1)).setAccountId(anyString());
    }
}

Я получаю стек ошибок, указанный ниже,

Требуется, но не вызывается: holder.setApiKey ();-> at com.ratepay.ella.service.config.EmailageServiceConfigurationTest.testEmailageConfigHolder (EmailageServiceConfigurationTest.java:48) На самом деле с этим макетом не было никаких взаимодействий.Разыскивается, но не вызывается: holder.setApiKey ();-> at com.ratepay.ella.service.config.EmailageServiceConfigurationTest.testEmailageConfigHolder (EmailageServiceConfigurationTest.java:48) На самом деле с этим макетом не было никаких взаимодействий.в com.ratepay.ella.service.config.EmailageServiceConfigurationTest.testEmailageConfigHolder (EmailageServiceConfigurationTest.java:48) в sun.reflect.NativeMethodAccessorImpl.invoke0 (родной метод) в sun.reflect.Net.Imp.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43) в java.lang.reflect.Method.invoke (Method.java:498) в org.junit.runners.model.FrameworkMethod50lho.defl.в org.junit.internal.runners.model.ReflectiveCallable.run (ReflectiveCallable.java:12) в org.junit.runners.model.FrameworkMethod.invokeExpsively (FrameworkMethod.java:47) в org.junit.intern.InvokeMethod.evaluate (InvokeMethod.java:17) в org.junit.runners.ParentRunner.runLeaf (ParentRunner.java:325) в org.junit.runners.BlockJUnit4ClassRunner.runChild (BlockJRunit.runners.BlockJUnit4ClassRunner.runChild (BlockJUnit4ClassRunner.java:57)в org.junit.runners.ParentRunner $ 3.run (ParentRunner.java:290) в org.junit.runners.ParentRunner $ 1.schedule (ParentRunner.java:71) в org.junit.runners.ParentRunner.runChildren (ParentRunner: 288) в org.junit.runners.ParentRunner.access $ 000 (ParentRunner.java:58) в org.junit.runners.ParentRunner $ 2.evaluate (ParentRunner.java:268) в org.junit.runners.ParentRunner.run (ParentRunner.java:363) в org.mockito.internal.runners.DefaultInternalRunner $ 1.run (DefaultInternalRunner.java:79) в org.mockito.internal.runners.DefaultInternalRunner.run (DefaultInternalRunner.java:85) в org.mockito.internal.runners.StrictRunner.run (StrictRunner.java:39) в org.mockito.junit.MockitoJUnitRunner.run (MockitoJUnitRunner.java:163) в org.junit.runner.JUnitCore.run (com): junit.intellij.junit4.JUnit4IdeaTestRunner.junit.JUnitStarter.prepareStreamsAndStart (JUnitStarter.java:242) в com.intellij.rt.execution.junit.JUnitStarter.main (JUnitStarter.java:70)

Как исправить тест?1013 *

Ответы [ 2 ]

5 голосов
/ 25 июня 2019

Здесь:

final EmailageConfigHolder holder = new EmailageConfigHolder();

Mockito не может вводить макеты в локальную переменную.В документации действительно об этом ясно сказано:

Mockito будет пытаться внедрять макеты только с помощью инжекции конструктора, инжектора сеттера или свойства, как описано ниже.

По сути, используя new() в теле вашего метода, вы написали сложный для тестирования код.Потому что с Mockito у вас есть ноль опций для управления тем, что new() вернет в теле этого метода.

Пути из этого:

  • делает это "holder "поле вашего класса, затем введите его с помощью этой аннотации или с помощью конструктора, принимающего экземпляр владельца
  • , передайте экземпляр в качестве параметра методу

или при условии, что вы можетефактически создайте новый объект Holder в производственном коде в вашей настройке модульного теста, и, поскольку вы возвращаете этот объект, просто утверждаете в свойствах возвращаемого объекта.С этой точки зрения вам вообще не нужно использовать насмешки.Просто убедитесь, что объект, возвращаемый после этого вызова, имеет ожидаемые свойства!

Или (не рекомендуется) вы можете обратиться к PowerMock (ito) или JMockit, чтобы получить контроль над этим вызовом new(),Но, как сказано: лучше переделать свой код, чтобы его можно было легко тестировать .

Кстати: реальный ответ в том, что вы отступаете назад и читаете хороший учебник о Mockito.Вы не можете научиться использовать такие рамки методом проб и ошибок.Узнайте, как это сделать правильно, с помощью хороших небольших примеров, а затем, когда вы поймете, как соединить точки, примените это к своему собственному коду!

0 голосов
/ 25 июня 2019

Хотя другой ответ лучше согласуется с ситуацией, я не могу обновить код и, наконец, написал этот тестовый код.

@RunWith( MockitoJUnitRunner.class )
public class EmailageServiceConfigurationTest {

    private static final String ACCOUNT_ID = "emailage.key";
    private static final String API_KEY = "emailage.secret";

    @InjectMocks
    private EmailageServiceConfiguration configuration;

    @Mock
    private Environment environment;

    @Test
    public void testEmailageConfigHolder() {

        configuration.emailageConfigHolder( environment );

        verify( environment, times( 1 ) ).getRequiredProperty( API_KEY );
        verify( environment, times( 1 ) ).getRequiredProperty( ACCOUNT_ID );
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...