Mockito Mock run Autowired класса Object
У меня ниже класс сценарий. Во время тестирования MyTestableClass я хочу обработать класс Autowired. Я хотел бы издеваться только над переменной в классе AutoWired.
образец класса, как показано ниже
public class MyTestableClass {
@Autowired
private MyServiceClass service;
public void handleError(){
...
service.doSomething();
}
}
public class MyServiceClass {
@Autowired
private JMSChannel channel;
public void doSomething(){
System.out.println("Inside Service class");
.....
channel.isAvailable();
.....
}
}
@RunWith(MockitoJUnitRunner.class)
public class MyTestableClassTest {
private MyTestableClass testClass= new MyTestableClass();
private JMSChannel channel;
@Before
public void init(){
channel= mock(JMSChannel.class);
when(channel.isAvailable()).thenReturn(Boolean.TRUE);
}
@Test
public void test(){
testClass.handleError();
}
}
Например, консоль должна дать мне "Внутренний класс обслуживания" перед возвратом true.
Заранее спасибо!
1 ответ
Вам нужно создать и экземпляр вашего сервиса (или макет его) и установить его канал на ваш смоделированный, а затем установить MyTestableClass#service
к этому. Что-то вроде:
@Before
public void init(){
channel= mock(JMSChannel.class);
when(channel.isAvailable()).thenReturn(Boolean.TRUE);
MyServiceClass service = new MyServiceClass();
ReflectionTestUtils.setField(service, "channel", channel);
myTestableClass = new MyTestableClass();
ReflectionTestUtils.setField(myTestableClass, "service", service);
}
с ReflectionTestUtils
из весеннего теста (Примечание: вместо этого вы можете использовать сеттер)