Arquillian с CDI, как имитировать инъекцию и избежать вставки зависимостей для WebArchive - PullRequest
0 голосов
/ 27 мая 2020

Допустим, у нас есть вложенные инъекции, и я хочу только протестировать класс MyService в тесте Arquillian, но только для ServiceB, а НЕ для serviceA, потому что он выходит за рамки теста, который я хочу выполнить, а также имеет много зависимостей добавить в WebArchive, например: .addClasses(serviceC.class, serviceCImpl.class) .addClasses(serviceD.class, serviceDImpl.class)

Попытка протестировать некоторые из этих сервисов может занять много времени, выбирая правильные зависимости, которые должны быть включены.

Есть ли способ имитировать службу A, чтобы она не была включена в webArchive, не запрашивая все эти файлы классов?

class MyServiceImpl{

@Inject
ServiceA serviceA;

@Inject
ServiceB serviceB;
}
interface MyService{}
interface ServiceA{}
interface ServiceB{}
interface ServiceC{}
interface ServiceD{}
class ServiceAImpl{

@Inject
ServiceC serviceC;

}


class ServiceAAlternative{

//just a mock class without other @Inject

}
class ServiceBImpl{

@Inject
ServiceD serviceD;
}

In arquillian:

Создание, возможно, реализации bean-компонента @Alternative или @Specializes (serviceAAlternative) и сохранение его в тестовом пакете можно использовать для MockPurposes. Это правильный подход? Хотя таким образом я не избегаю добавления всех зависимостей, необходимых для serviceAImpl.

    @Deployment
    public static WebArchive createDeployment() {
        WebArchive war = ShrinkWrap.create(WebArchive.class, "test.war")
                .addClasses(MyService.class, MyServiceImpl.class)
                .addClasses(ServiceA.class, ServiceAImpl.class, ServiceAAlternative.class)
                .addClasses(ServiceB.class, ServiceBImpl.class)
                .addClasses(ServiceC.class, ServiceCImpl.class)
                .addClasses(ServiceD.class, ServiceDImpl.class)
                .addAsWebInfResource("test-beans.xml", "beans.xml");

             return war;      }

Arquillian WebArchive, который я хочу иметь, без вложенной инъекции ServiceA, то есть Service C, и без ServiceAImpl и его зависимости. Есть идеи, как подойти к этой проблеме?

    @Deployment
    public static WebArchive createDeployment() {
        WebArchive war = ShrinkWrap.create(WebArchive.class, "test.war")
                .addClasses(MyService.class, MyServiceImpl.class)
                .addClasses(ServiceA.class, ServiceAAlternative.class)
                .addClasses(ServiceB.class, ServiceBImpl.class)

                .addClasses(ServiceD.class, ServiceDImpl.class)
                .addAsWebInfResource("test-beans.xml", "beans.xml");

             return war;      }

...