Шпионская сервисная пружина с транзакционными методами - PullRequest
1 голос
/ 28 июня 2019

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

Mockito cannot mock/spy because :
 - final class

Если я удаляю @Transactional из методов, шпион работает правильно.Я понимаю, что это проблема из-за службы прокси.Как я могу решить эту вещь?

Мой тестовый класс:

@RunWith(SpringRunner.class)
@ContextConfiguration(classes = {CreateIfcClusterTaskTest.Config.class})
@DirtiesContext(classMode =
        DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD)
public class CreateIfcClusterTaskTest {

    static class Config extends SpringTestConfiguration {
        @Bean
        @Primary
        public VirtualControllerService
        virtualControllerService(VirtualControllerService
                                         virtualControllerService) {
            return Mockito.spy(virtualControllerService);
        }
    }
}

Мой сервис - VirtualControllerService:

public interface VirtualControllerService {

    JsonHost createVifcHostForWebApi(VirtualController virtualController);

    void stopDocker(DockerClient docker, String joinerIpAddress) throws
            DockerException, InterruptedException;


}

Мой сервисный импл - VirtualControllerServiceImpl:

@Service
public class VirtualControllerServiceImpl implements
        VirtualControllerService {
    @Override
    @Transactional
    public JsonHost createVifcHostForWebApi(VirtualController
                                                    virtualController) {
        JsonHost jsonHost = new JsonHost();
        jsonHost.setIP(virtualController.getIpAddress());
        jsonHost.setUser(environment.getProperty("VIFC_WEBAPI_USER"));



        jsonHost.setPassword(environment.getProperty("VIFC_WEBAPI_PASSWORD"));


        return jsonHost;
    }

}

Ответы [ 2 ]

1 голос
/ 28 июня 2019

В соответствии с этой проблемой, которую я обнаружил, одним из возможных путей решения этой проблемы является использование

Так что вместо: spy (proxy) используйте mock (TestSubject.class, DelegatesTo (springProxy))).

В вашем случае (не проверенном мной) это, вероятно, будет

return Mockito.mock(VirtualControllerService.class, AdditionalAnswers.delegatesTo(virtualControllerService));

См. AdditionalAnswers.delegateTo для получения дополнительной информации.Обратите внимание, что вы не можете заглушить или проверить внутренние вызовы методов в вашем экземпляре spied (будет отслеживаться только вызов метода для фиктивного объекта).Вариант использования:

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

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

Вместо создания компонента класса Service в вашей конфигурации вы можете использовать аннотацию @Mock в своем тестовом классе CreateIfcClusterTaskTest для макета экземпляра службы.

Это будет выглядеть примерно так:

@RunWith(SpringRunner.class)
@ContextConfiguration(classes = { CreateIfcClusterTaskTest.Config.class })
@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD)
public class CreateIfcClusterTaskTest {

    @Mock
    VirtualControllerService virtualControllerService;
}

И вам придется инициализировать Объекты, используя аннотации Мокито следующим образом:

@Before
public void setUp() throws Exception {
    MockitoAnnotations.initMocks(this);
}

Надеюсь, это поможет.

...