Легкая насмешка: установка ожидания внутри @PostConstruct

У меня есть класс, который использует @PostConstruct для кэширования некоторых объектов.

@Component
public class A {

   @Autowired
   private B b;

   private X x;

   @PostConstruct 
   public void init(){
       x = b.doSomething()
   }

}

public class C {

   @Autowired
   private A; 
}


public class TestClass {

   @Autowired
   private A;

   @Before
   public init() {
       expect(b.dosomething()).andReturns(x);
   }

   @Test
   public test1() {
       //test
   }
}

Я высмеял B, так как он делает HTTP-вызов, чтобы получить х. Но при выполнении этого через модульное тестирование я получаю следующую ошибку:

Missing behaviour definition for the preceding method call:
B.dosomething().andXXX() 

Все работает нормально, если я делаю то же самое в каком-то обычном методе класса А. Я использую Spring для внедрения зависимостей.

Я думаю, что причина этого поведения в том, что я устанавливаю ожидание для макета класса B внутри моего модульного теста, который вызывается "после" вызова этого метода init. Как я могу проверить это?

1 ответ

Если вы хотите протестировать код в аннотированном методе init init @PostConstruct класса A, вы можете протестировать его без использования Spring в своем тесте. Вам нужно будет ввести зависимости вручную.

Один из способов сделать это будет:

import org.easymock.EasyMock;
import org.junit.Before;
import org.junit.Test;
import org.powermock.reflect.Whitebox;

public class TestA {

    private A a = new A();
    private B b = EasyMock.createMock(B.class);

    @Before
    public void init() {
        Whitebox.setInternalState(a, "b", b);
    }

    @Test
    public void testInit() {
        EasyMock.reset(b);
        //define mock behavior here
        EasyMock.replay(b);

        a.init();

        //assert and verify
        EasyMock.verify(b);
    }
}
Другие вопросы по тегам