Тестирование @Postconstruct с помощью Mockito - PullRequest
0 голосов
/ 25 сентября 2018

Почему, когда я делаю инъекции через Mockito, мой @Postconstruckt метод не вызывает?

@Service
public class MyService {
    public MyService() {
        System.out.println("CONSTRUKTOR");
    }

    @PostConstruct
    public void init() {
        System.out.println("POST CONSTRUCT");
    }

@RunWith(MockitoJUnitRunner.class)
public class Mockito1 {

    @InjectMocks
    private MyService service;

    @Before
    public void init() {
    }

Вывод: только: CONSTRUKTOR

Ответы [ 3 ]

0 голосов
/ 25 сентября 2018

@PostConstruct - это аннотация, определенная JSR 250, и она будет проигнорирована в текущем тесте, поскольку вы используете @RunWith(MockitoJUnitRunner.class), т. Е. Средство запуска JUnit, которое не знает об этой аннотации.Если вы пишете модульные тесты, они должны быть простыми, а просто тестировать бизнес-логику вашего приложения, но если вы хотите написать интеграционные тесты, использующие какой-либо сторонний код, который может обрабатывать аннотации такого типа, например Spring, например,Затем вы можете аннотировать свой тестовый класс следующими аннотациями:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {AppConfig.class})
0 голосов
/ 25 сентября 2018

Я немного изменил ваш сервис, добавив метод foo:

@Service
public class MyService {
    public MyService() {
        System.out.println("CONSTRUKTOR");
    }

    @PostConstruct
    public void init() {
        System.out.println("POST CONSTRUCT");
    }

    public String foo() {
        return "bar";
    }
}

Если вы хотите получить поведение, которое вы описали, есть как минимум две возможности:

  1. @RunWith(SpringJUnit4ClassRunner.class) + @Autowired - эта комбинация позволит вам получить обычную услугу в вашем тесте

    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(classes = MyService.class)
    public class Mockito1 {
    
        @Autowired
        private MyService service;
    
        @Before
        public void init() {
        }
    
        @Test
        public void name() throws Exception {
            System.out.println(service.foo());
        }
    }
    

Этот код напечатает:

CONSTRUKTOR
POST CONSTRUCT
bar

@RunWith(SpringJUnit4ClassRunner.class) + @SpyBean - эта комбинация позволит вам получить услугу в своем тесте и изменить ее поведение, используя Mockito

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = MyService.class)
public class Mockito1 {

    @SpyBean
    private MyService service;

    @Before
    public void init() {
    }

    @Test
    public void name() throws Exception {
        System.out.println(service.foo());
        Mockito.when(service.foo()).thenReturn("FOO");
        System.out.println(service.foo());
    }
}

Этот коднапечатает:

CONSTRUKTOR
POST CONSTRUCT
bar
FOO
0 голосов
/ 25 сентября 2018

Потому что PostConstruct - это только концепция весны.Но вы можете позвонить в postConstruct вручную.

@Before
public void prepare() {
    MockitoAnnotations.initMocks(this);
    this.service.init(); //your Injected bean
}
...