2014-09-18 166 views
0

我是新的與春季和Mockito測試。我無法找到我的問題在stackoverflow的答案。春+ Mockito注射不工作

我有以下類別:

@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。 – 2014-09-18 19:37:44

+0

是的,這是我真正上課的簡單例子,我在嘲笑其他班級。模擬班級成功實施,但服務不成功。 – 2014-09-18 19:40:56

+0

正如我在測試類中所說的,我沒有看到將它與Spring聯繫起來的東西,因此不確定它應該如何實例化類。它也不會向控制器注入模擬器,因爲不會有控制器。你可以修改你的帖子,以更好地反映你的情況,因爲它現在沒有。 – 2014-09-18 19:45:55

回答

1

看着你的代碼,你似乎在用集成測試來混合單元測試。

MockMvc通常用於從控制器級開始進行集成測試。這意味着您需要配置並啓動的applicationContext才能成功使用它。如果這就是這個測試類應該做的事情,那麼我不會看到Mocks的使用,除非你在應用上下文中連線它們,否則你的控制器將不會使用它們。

如果你想做集成測試,但想要模擬或刪除某些功能(在我看來應該只是因爲依賴於外部系統才能完成),你應該考慮在你的applicationContext中爲這個測試連接一些存根而不是試圖爲此使用Mockito。

還要記住,默認情況下,應用程序上下文被重新用於運行所有的測試,這可能意味着一個測試的存根可能會影響另一個測試。