2016-05-31 17 views
0

vor allem: Ich bin ziemlich neu in Spring.Test Spring MVC mit Mockito

Ich habe eine sehr einfache Feder-Boot-App mit 3 file: Haupt App:

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

Controller:

@RestController 
public class GreetingsController { 

    @Autowired 
    private SomeService svc; 

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

und ein "Service":

@Service 
public class SomeService { 

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

I Jetzt möchte ich einen (Integrations-) Test schreiben wo der Dienst (welcher in meiner realen Anwendung einen DB con hat) nection) wird verspottet. Was ich habe, ist dies:

@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()); 
    } 
} 

Leider ist dieser Test nicht besteht, weil der eigentliche Dienst wird während des Tests verwendet wird und nicht meine Mock-Service. Was mache ich falsch? Wie kann ich dem Framework mitteilen, den Mock-Service während des Testens zu verwenden?

Danke und Grüße

Antwort

1

Sie benötigen separate Konfigurationen für Produktion und Prüfung.

Die Produktionskonfiguration fragt Spring, um die echte Klasse zu injizieren. Die Testkonfiguration schleicht sich stattdessen in den Mock.

In letzter Zeit habe ich versucht, ohne Frühling zu testen. Ich benutze Mockito und spritze manuell in meine Tests. Ich verlasse die Bohnenfabrik. Dadurch kann ich Mocks verwenden und meine Tests schneller ausführen, da ich nur die Beans instanziiere, die ich für den Test benötige.

+0

Testen ohne Feder ist in der Regel ein guter Ansatz, wann immer es möglich ist. Wenn Sie Bohnen verspotten müssen, könnten Sie an der Annotation "@ MockBean" in Spring Boot 1.4 interessiert sein (https://spring.io/blog/2016/04/15/testing-improvements-in-spring-boot- 1-4) –

+0

@Phil Webb, danke. Liebe deine Arbeit mit Spring Boot. Wir migrieren alle unsere Sachen von JBOSS zu Pivotal Cloud Foundry. Wir hatten in den letzten 6 Jahren Spring-Apps, mussten aber immer auf JBOSS bereitstellen. Nicht mehr in einem anderen Monat oder so. – duffymo