2014-09-18 2 views
0

Я новичок в тестировании Spring и Mockito. Я не смог найти ответ на свою проблему в stackoverflow.Spring + Mockito injection не работает

У меня есть следующие классы:

@EnableScheduling 
@Service 
public class ServiceEx { 

    private Queue<Object> tasks = new ConcurrentLinkedQueue(); 

    public void addItem(Object task) { 
     tasks.add(task); 
    } 

    @Scheduled(fixedRate = 30000) 
    public void executePendingTask() { 
     tasks.remove(); 
    } 

    public void drop() { 
     tasks.clear(); 
    } 

    public boolean isEmpty() { 
     return tasks.isEmpty(); 
    } 
} 

@Controller 
@RequestMapping("/drop") 
public class ControllerEx { 

    private ServiceEx service; 

    @Inject 
    public ControllerEx(ServiceEx service) { 
     this.service = service; 
    } 

    @RequestMapping(method = RequestMethod.GET) 
    public String dropTasks(Model model) { 
     service.drop(); 
     return "redirect:/home"; 
    } 

} 

И мой класс тестирования выглядит следующим образом:

public class ControllerTest { 

    @Inject 
    private ServiceEx service; 

    @InjectMocks 
    private ControllerEx controller; 
    private MockMvc mockMvc; 

    @Before 
    public void setUp() throws Exception { 
     MockitoAnnotations.initMocks(this); 
     this.mockMvc = MockMvcBuilders.standaloneSetup(controller).build(); 
    } 

    @Test 
    public void test() { 
     service.add(task1); 
     service.add(task2); 
     this.mockMvc.perform(get("/drop")).andExpect(status().is3xxRedirection()); 
     assertTrue(service.isEmpty()); 
    } 

} 

Моя проблема заключается в том, что сервис является недействительным как в ControlleEx и ControllerTest и я не хочу издеваться над ним. Я попробовал несколько аннотаций, но не нашел, какой из них использовать.

Что я сделал не так?

+0

Ничего не загрузите ваши услуги. У вас нет издевательств в вашем тесте, поэтому нечего насмехаться. Поэтому не уверен, почему вы даже используете Mockito здесь. –

+0

Да, это упрощенный пример моего настоящего класса, я издеваюсь над другими классами. Выделенные классы успешно созданы, но услуг нет. –

+0

Как я уже сказал в вашем тестовом классе, я не вижу ничего связанного с Spring, поэтому не уверен, как он должен создавать классы. Он также не будет вводить насмешки в контроллер, так как контроллера не будет. Можете ли вы изменить свое сообщение, чтобы лучше отразить ваше дело, как в настоящий момент это не так. –

ответ

1

Глядя на ваш код, вы, кажется, участвуете в модульных тестах с интеграционными тестами.

MockMvc обычно используется для проведения интеграционных тестов, начиная с уровня контроллера. это означает, что вам нужно сконфигурировать и запустить applicationContext для успешного использования. Если это то, что должен сделать этот тестовый класс, я не вижу использования Mocks, если вы не подключаете их в контексте приложения, ваш контроллер не будет их использовать.

Если вы хотите выполнить интеграционное тестирование, но хотите, чтобы Mock или заглушить определенные функции (которые, на мой взгляд, должны выполняться только из-за зависимостей от внешних систем), вы должны подумать о подключении некоторых заглушек в свой applicationContext для этого теста вместо того, чтобы пытаться использовать Mockito для этого.

Также имейте в виду, что по умолчанию приложениеContext повторно используется для запуска всех ваших тестов, что может означать, что окунирование для одного теста может повлиять на другое.