2017-05-09 2 views
1

ich eine Probe IntegrationFlow erstellt, wie unten dargestellt:Frühling Boot Integration Unit-Tests NoSuchBeanDefinitionException Ausnahme

@Configuration 
@EnableIntegration 
@IntegrationComponentScan 
@ComponentScan 
public class RegisterHostFlow { 
    private final Logger LOG = LoggerFactory.getLogger(this.getClass()); 

    @MessagingGateway 
    public interface RegisterHostGateway{ 
     @Gateway(requestChannel = "registerHostInputChannel") 
     Host registerHost(Host host); 
    } 

    @Bean 
    public IntegrationFlow httpInboundGatewayFlow() { 
     return IntegrationFlows.from("registerHostInputChannel") 
      .handle((host, headers) -> { 
         return host; 
      }) 
      .enrich(e -> e 
        .requestPayload(Message::getPayload) 
        .property("uuid", "34563456345634563456") 
        .property("id", "1234") 
      ) 
      .get(); 
    } 
} 

Ich rufe diese von einer Feder MVC-Controller wie folgt:

RegisterHostFlow.RegisterHostGateway registerHostGateway = applicationContext.getBean(RegisterHostFlow.RegisterHostGateway.class); 
    Host host1 = registerHostGateway.registerHost(host); 

Wenn ich ein Gerät schreiben testen, um einige Vernunfttests durchzuführen, wie unten gezeigt, kann die Anwendung nicht mit dem folgenden Fehler geladen werden: NoSuchBeanException:

@RunWith(SpringRunner.class) 
@WebMvcTest(HostController.class) 
@EnableIntegration 
@IntegrationComponentScan 
public class HostControllerTest { 
@Autowired 
private MockMvc mvc; 

@Test 
public void registerHost_passedInHost_returnJson() throws Exception { 
    this.mvc.perform(post("/hostservice/v1/hosts").contentType(MediaType.APPLICATION_JSON). content('someJsonStringGoesHere')) 
      .andExpect(status().isOk()) 
      .andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8)); 
} 

Im Folgenden wird die Ausnahme sehe ich:

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'registerHostInputChannel' available 

at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:982) 
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:872) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:648) 
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846) 
at org.springframework.test.web.servlet.TestDispatcherServlet.service(TestDispatcherServlet.java:65) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:729) 
at org.springframework.mock.web.MockFilterChain$ServletFilterProxy.doFilter(MockFilterChain.java:167) 
at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) 
at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99) 
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) 
at org.springframework.web.filter.HttpPutFormContentFilter.doFilterInternal(HttpPutFormContentFilter.java:105) 
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) 
at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:81) 
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) 
at org.springframework.test.web.servlet.MockMvc.perform(MockMvc.java:155) 

Alle Hinweise, wie Application zu haben, um die Integration Bohnen autowire wenn im Testmodus?

Antwort

2

Nach der @WebMvcTest JavaDocs:

* Typically {@code @WebMvcTest} is used in combination with {@link MockBean @MockBean} or 
* {@link Import @Import} to create any collaborators required by your {@code @Controller} 
* beans. 

Sie haben Ihre Testklasse Config wie zu machen:

@RunWith(SpringRunner.class) 
@WebMvcTest(HostController.class) 
@Import(RegisterHostFlow.class) 
public class HostControllerTest { 

Also, auf diese Weise haben Sie eine MVC in Scheiben schneiden und Mitarbeiter in Gesicht des Frühlings Integration und Ziel-Flow-Konfiguration.