2016-05-31 70 views
0

:我對Spring比較陌生。首先用Mockito測試Spring MVC

我有3檔一個非常簡單的Spring啓動的應用程序: 主要應用:

@SpringBootApplication 
public class App 
{ 
    public static void main(String[] args) 
    { 
     SpringApplication.run(App.class, args); 
    } 
} 

控制器:

@RestController 
public class GreetingsController { 

    @Autowired 
    private SomeService svc; 

    @RequestMapping("/greeting") 
    public String greeting() { 
     System.out.println(svc.sayHello()); 
     return svc.sayHello(); 
    } 
} 

與 「服務」:

@Service 
public class SomeService { 

    public String sayHello() { 
     return "Hello from the real thing"; 
    } 
} 

我現在想寫一個(集成)測試,其中的服務(在我的真實應用程序中會有一些數據庫連接nection)被嘲笑。我所擁有的是這樣的:

@RunWith(SpringJUnit4ClassRunner.class) 
@SpringApplicationConfiguration(classes = App.class) 
@WebAppConfiguration 
public class AppTest 
{ 
    private MockMvc mockMvc; 

    @Mock 
    private SomeService svcMock; 

    @Autowired 
    private WebApplicationContext webApplicationContext; 

    @Before 
    public void setup() throws Exception { 
     MockitoAnnotations.initMocks(this); 
     Mockito.when(svcMock.sayHello()).thenReturn("Hello from Mock"); 
     this.mockMvc = webAppContextSetup(webApplicationContext).build(); 
    } 

    @Test 
    public void run() throws Exception { 
     MvcResult res = mockMvc.perform(get("/greeting")) 
      .andExpect(status().isOk()) 
      .andReturn(); 
     assertEquals("Hello from Mock", res.getResponse().getContentAsString()); 
    } 
} 

不幸的是,因爲在測試過程中,而不是我的模擬服務正在使用的真正的服務測試失敗。我究竟做錯了什麼?我如何告訴框架在測試期間使用Mock服務?

感謝和問候

回答

1

您需要單獨的配置進行生產和測試。

生產配置要求Spring注入真實的類。相反,測試配置在模擬中潛行。

最近我一直在試圖沒有春天。我使用Mockito並在我的測試中手動注入。我離開了豆製品工廠。這讓我可以使用mock並使我的測試運行得更快,因爲我只是實例化測試需要的bean。

+0

沒有使用Spring進行測試通常是一種儘可能採取的好方法。如果你確實需要模擬bean,你可能會對Spring Boot 1.4中的'@ MockBean'註釋感興趣(https://spring.io/blog/2016/04/15/testing-improvements-in-spring-boot- 1-4) –

+0

@Phil Webb,謝謝。用Spring Boot熱愛你的工作。我們正在將所有的東西從JBOSS遷移到Pivotal Cloud Foundry。我們在過去的6年中使用過Spring應用程序,但總是被迫部署在JBOSS上。在另一個月左右沒有更多。 – duffymo