Mockbean, содержащий автосвязанную зависимость

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

Пример:

public class testclass {
    @Autowired
    private ClassToTest classToTest;
    @MockBean
    private DependencyOfClassToTest dependencyOfClassToTest;
    @Mockbean
    private MyOwnDependencyINeedHereInTheMock myOwnDependencyINeedHereInTheMock;
}

public class DependencyOfClassToTest {
    @Autowired
    private MyOwnDependencyINeedHereInTheMock myOwnDependencyINeedHereInTheMock;
}

Как видно выше, имитированный компонент содержит зависимость @Autowired.

Любые решения для этого или я нарушаю какое-то правило тестирования?

Когда вызывается фактический метод в имитированном bean-компоненте, он вызывает myOwnDependencyINeedHereInTheMock, который будет нулевым, потому что это mockbean.

MockBeans не является нулевой в классе @Autowired, поэтому Spring Boot их находит.

Вы уверены, что ваш тест использует имитированную версию компонента? Если это так, то внутренности «настоящего» bean-компонента не должны иметь значения, тот факт, что реальный bean-компонент имеет другие зависимости, не имеет значения, в этом весь смысл макета.

DaveyDaveDave 06.03.2019 15:54

@DaveyDaveDave Да, я не передаю bean-компонент тестируемому классу каким-либо другим способом, кроме этой аннотации.

Lithicas 06.03.2019 15:57

Я думаю, вам может понадобиться показать больше кода — можете ли вы отредактировать свой пост, чтобы включить тест (надеюсь, MCVE)? Кроме того, откуда вы знаете, что MyOwnDependencyINeedHereInTheMock равно нулю?

DaveyDaveDave 06.03.2019 16:01

Если вы вызываете метод для издевательского объекта, он всегда будет возвращать нулевое значение, возможно, вы думали, что это происходит из-за того, что ваш MyOwnDependencyINeedHereInTheMock не был автоматически подключен, но похоже, что вы не знали, как использовать моки. Вы должны предопределить поведение вызываемого метода. В этом случае, если вы вызываете метод, он должен вернуть ваше предопределенное значение, и не имеет значения, что находится внутри имитируемого объекта (я имею в виду MyOwnDependencyINeedHereInTheMock, а другие объекты могут быть нулевыми). В противном случае что-то не так с вашей тестовой конфигурацией, и вы вызываете методы для реального объекта.

borino 07.03.2019 06:55
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
4
2 541
1

Ответы 1

Издевайтесь над этим бобом тоже!

    public class testclass {
        @Autowired
        private ClassToTest classToTest;
        @MockBean
        private DependencyOfClassToTest dependencyOfClassToTest;
        @MockBean
        private MyOwnDependencyINeedHereInTheMock myOwnDependencyINeedHereInTheMock;
    }

    public class DependencyOfClassToTest {
        @Autowired
        private MyOwnDependencyINeedHereInTheMock myOwnDependencyINeedHereInTheMock;
    }

Обновить: нижеприведенный тестовый класс работает для меня

@RunWith(SpringRunner.class)
@SpringBootTest
public class ApplicationTests {

    @Autowired
    private ClassToTest classToTest;
    @MockBean
    private DependencyOfClassToTest dependencyOfClassToTest;
    @MockBean
    private MyOwnDependencyINeedHereInTheMock myOwnDependencyINeedHereInTheMock;

    @Test
    public void contextLoads() {

        System.out.println("test"+myOwnDependencyINeedHereInTheMock);
    }



    @TestConfiguration  
    static class Context{

        @Component
         static class ClassToTest{

            @Autowired
            private DependencyOfClassToTest  dependencyOfClassToTest;
        }

        @Component
         static class DependencyOfClassToTest{
            @Autowired
            private MyOwnDependencyINeedHereInTheMock myOwnDependencyINeedHereInTheMock;


        }

        @Component
         static class MyOwnDependencyINeedHereInTheMock{

        }


    }
}

Я пробовал это, но это не работает. MockBeans не равен нулю только в поле @Autowired.

Lithicas 06.03.2019 15:52

в приведенном вами примере ClassToTest должен быть тестируемым классом, и в нем должен быть автоматически подключен DependencyOfClassToTest, чего нет.

Lithicas 07.03.2019 09:51

Другие вопросы по теме