Протестируйте методы void с классами Autowired

Я новичок в Spring, и мне нужно написать тест для этого класса, если он вызывает методы:

class ClassOne {

    @Autowired
    AutowiredClass a1;

    @Autowired
    AutowiredClass a2;

    void methodOne() {
        a1.method1();    
    }

    void methodTwo() {
        a2.method2();
    }
}

Пробовал написать тест, но не получилось, получил NPE:

class ClassOneTest {

    @Autowired
    ClassOneInterface c1i;

    @Test
    public void testMethod1() {
        c1i.methodOne();  // <- NPE appears here..
        Mockito.verify(ClassOne.class, Mockito.times(1));
    }
}

Было бы здорово успешно протестировать методы пустоты.

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

Ответы 3

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

@RunWith(SpringRunner.class)
@SpringBootTest
class ClassOneTest {

    @Autowired
    ClassOneInterface c1i;

    @Test
    public void testMethod1() {
        c1i.methodOne();  // <- NPE appears here..
        Mockito.verify(ClassOne.class, Mockito.times(1));
    }
}

Попробуйте взглянуть на: Аналогичная ошибка теста NPE

ClassOne определяет Spring bean. Чтобы автоматически связать поля bean-компонента, вам нужен контекст Spring.

Если вы хотите протестировать ClassOne как SPRING BEAN, вам нужно использовать SpringTest.

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({MyConfig.class}) // Spring context config class
class ClassOneTest {

    @Autowired
    ClassOneInterface c1i;
...
}

Bean-компонент ClassOne будет введен в поле набора тестов c1i.

Затем вы можете следить за полем, используя mockito:

ClassOne cSpy = spy(c1i);

Затем вы можете проверить вызовы метода:

verify(cSpy).someMethod(someParam);

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

Ответ принят как подходящий

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

@RunWith(MockitoJUnitRunner.class)
public class MyLauncherTest {

    @InjectMocks
    private ClassOne c1 = new ClassOne();

    @Mock
    private AutowiredClass a1;

    @Mock
    private AutowiredClass a2;

    @Test
    public void methodOne() {
        c1.methodOne(); // call the not mocked method
        Mockito.verify(a1).method1(); //verify if the a1.method() is called inside the methodOne
    }
}

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