【问题标题】:Spring boot Integration unit testing NoSuchBeanDefinitionException exceptionSpring boot 集成单元测试 NoSuchBeanDefinitionException 异常
【发布时间】:2018-05-29 22:54:54
【问题描述】:

我创建了一个示例 IntegrationFlow,如下所示:

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

我从一个 spring MVC 控制器调用它,如下所示:

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

当我编写一个单元测试来进行如下所示的一些健全性测试时,应用程序无法加载并出现错误,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));
}

下面是我看到的异常:

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)

任何关于如何让 ApplicationContext 在测试模式下自动装配集成 bean 的指针?

【问题讨论】:

    标签: spring-boot spring-integration spring-mvc-test


    【解决方案1】:

    根据@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.
    

    你必须让你的测试类配置如下:

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

    因此,这样一来,您就拥有了一个 MVC 切片和协作者来面对 Spring 集成和目标流配置。

    【讨论】:

      猜你喜欢
      • 2015-02-10
      • 2019-07-06
      • 1970-01-01
      • 1970-01-01
      • 2020-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-20
      相关资源
      最近更新 更多