2013-04-19 5 views
0

У меня есть 3 класса:Mockito и вложенный вызов метода

public class SomeDAO { 

    // that method I'd want to catch and change 
    public void getObj() { ... } 

} 

public class MainService { 

    private Service2 service2; 

    public void doMain() { 
     service2.doSomethingAnother(); 
    } 

} 

public class Service2 { 

    private SomeDAO someDAO 

    public void doSomethingAnother() { 
     someDAO.getObj(); 
    } 
} 

Все, что мне нужно - для вызова Доменные но с обычаем someDao.getObj() внутри service2.doSomethingAnother():

public TestClass { 

    @InjectMocks 
    private final MainService mainService = new MainService(); 

    @InjectMocks 
    private final Service2 service2 = new Service2(); 

    @Mock 
    private SomeDAO someDao; 

    @Test 
    public void testMe() { 

     // substitution 
     when(someDao.getObj()).thenReturn(new MyObj()); 

     // then I'm calling the outer method 
     mainService.doMain(); 

    } 

} 

при выполнении этого теста у меня есть NPE в mainService.doMain(): service2 в нуль ..

Внутри testMe объект service2 is alive, а не null, он был объявлен как переменная класса и инициализирован.

Независимо от того, нарушаю ли я поведение @InjectMock?

ответ

7

Service2 не вводится в MainService, так как это не издевательство. Поэтому атрибут server2 вашего объекта mainService - null.

Вы также пытаетесь насмехаться слишком глубоко. Правильный способ тестирования MainService состоит в том, чтобы высмеять зависимость Service2, а не SomeDAO.

Отдельный класс испытаний для Service2 лучше, если вы издеваетесь над зависимостью SomeDAO.

public TestClass { 

    @InjectMocks 
    private MainService mainService; 

    @Mock 
    private Service2 service2; 

    @Before 
    public void setUp() { 
     initMocks(this); 
    } 

    @Test 
    public void testMe() { 
     mainService.doMain(); 

     verify(service2).doSomethingAnother(); 

    } 

} 
Смежные вопросы