Легкая насмешка: установка ожидания внутри @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);
}
}