Mockito Mock запускает объект класса Autowired

У меня ниже классный сценарий. При тестировании 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();
    }
}

Например, консоль должна предоставить мне «Внутренний класс обслуживания» перед тем, как вернуть истину.

Заранее спасибо !


person Umesh Patil    schedule 31.03.2016    source источник
comment
+1, как мне создать экземпляр сервиса Autowired? Я не хочу издеваться над этим, чтобы попасть в doSomething (). Спасибо!   -  person Umesh Patil    schedule 31.03.2016
comment
В идеале переходите от внедрения поля к внедрению конструктора, а затем просто передайте макет конструктору.   -  person chrylis -cautiouslyoptimistic-    schedule 31.03.2016
comment
@chrylis, могу я спросить пример / код?   -  person Umesh Patil    schedule 31.03.2016


Ответы (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 из spring- test (NB: вместо этого вы можете использовать сеттер)

person Community    schedule 31.03.2016
comment
Mockito поставляется с классом Whitebox. который в основном делает то же самое, что и ReflectionTestUtils - person Roman Vottner; 31.03.2016
comment
Я получаю исключение java.lang.IllegalArgumentException: не удалось найти поле [канал] типа [null] в целевом [MyServiceClass] во время выполнения этого теста. - person Umesh Patil; 31.03.2016
comment
Это не готовый к использованию ответ путем копирования и вставки, это просто отправная точка / объяснение. Я исправил ошибку, которая могла бы объяснить вашу ошибку. - person ; 31.03.2016