Как в QuarkusTest использовать макеты в одних случаях, но не в других?

У меня есть два класса в приложении Quarkus, назовем их Службой A и Службой B. Служба B является зависимостью от A. Когда я тестирую Службу A, я хочу имитировать Службу B. Когда я тестирую ServiceB, я хочу протестировать настоящий Service B.

Я создал класс MockServiceB, следуя этому руководству на quarkus.io. Если я положу его в свой каталог /test, мой ServiceATest правильно захватит макет. Но то же самое будет и с моим классом ServiceBTest. Как я могу выборочно вводить макеты в разные классы? А еще лучше, могу ли я выборочно использовать разные макеты для разных методов?

(Я пытался вернуться к использованию Mockito, но, похоже, он не работает с Quarkus и QuarkusTest, если я не ошибаюсь.)

@ApplicationScoped
public class ServiceA {
    @Inject
    ServiceB serviceB;

    public int giveMeANumber() {
        serviceB.getNumber();
    }
}

@ApplicationScoped
public class ServiceB {

    public int getNumber() {
        // does the real work;
        return 1;
    }
}


@QuarkusTest
class ServiceATest {
    @Inject
    ServiceA serviceA;

   @Test
    public void shouldReturnNumber() {
        int number = serviceA.giveMeANumber();
        assertEquals(1, number);
    }
}

@Mock
@ApplicationScoped
class MockServiceB extends ServiceB {
    @Override
    public int getNumber() {
        // don’t do the real work
        return 1;
    }
}

@QuarkusTest
class ServiceBTest {

    @Inject
    ServiceB serviceB;

    @Test
    public void shouldGetNumber() {
        int number = serviceB.getNumber();
        // uses the mock, I don't want it to
        assertEquals(1, number);
    }
}

person Brendan Whiting    schedule 11.08.2019    source источник
comment
В настоящее время это не поддерживается из коробки, но это может измениться в будущем.   -  person geoand    schedule 22.08.2019
comment
Хорошо спасибо. Я думаю, что это может быть нарушителем сделки для меня. Возможно, сейчас нужно положить Quarkus обратно на полку.   -  person Brendan Whiting    schedule 22.08.2019
comment
Возможность сделать это может быть ближе к горизонту, а не дальше. Я бы посоветовал обратить на это внимание   -  person geoand    schedule 22.08.2019
comment
Прохладный. Я построю так, чтобы без особых проблем перейти на quarkus.   -  person Brendan Whiting    schedule 22.08.2019
comment
@geoи нашел эту заявку для отслеживания этой проблемы, есть ли другие?   -  person jordanpg    schedule 08.04.2020
comment
Это тот самый @jordanpg   -  person geoand    schedule 09.04.2020


Ответы (1)


Начиная с Quarkus 1.4, вы можете использовать макеты Mockito для компонентов CDI с обычной областью действия (поэтому @ApplicationScoped можно имитировать, @Singleton нельзя), используя аннотацию @InjectMock. См. это для документации и это для примера использования.

person geoand    schedule 09.04.2020