2017-05-18 72 views
1

我有一個彈簧啓動應用程序,它不比通過具有@ SqsListener註釋方法的組件「MessageHandler」偵聽SQS隊列啓動一些工作當一條消息到達時。如何在模塊/集成測試中禁用Spring SQS處理程序

由於我們想通過生產中的http獲取健康狀態和度量,因此還存在引導啓動器 - Web依賴關係。

現在我想寫一個模塊測試,它已經有一個應用程序上下文和autowires bean。我也發現瞭如何禁用不需要通過測試Web服務器:

@RunWith(SpringRunner.class) 
@SpringBootTest(webEnvironment = NONE) 

然而,MessageHandler的豆也被實例化,並嘗試連接到AWS,我想這要防止的。

一個解決方案,工程是有@Primary註解,它的handleMessage方法不具有@SqsListener註釋中的src/test/java下一個測試實施:

@Component 
@Primary 
public class TestMessageHandler implements MessageHandler { 

    @Override 
    public void handleMessage(final NewMessage newMessage) throws Exception { 
     return null; 
    } 
} 

但現在我想還測試(真正的)MessageHandler bean,這意味着,我希望Spring實例化它並自動裝載它的依賴項,但是我仍然不希望@SqsListener註釋變爲活動的,所以我可以在我的測試中像這樣調用它:

@RunWith(SpringRunner.class) 
@SpringBootTest(webEnvironment = NONE) 
public class IntegrationTest { 

    @Autowired 
    private RealMessageHandler messageHandler; 


    @Test 
    public void testHandleMessage() throws Exception { 
     messageHandler.handleMessage(new NewMessage(...)); 
    } 
} 

所以我需要的是切換f來自Spring-cloud-aws-starter模塊的魔法,它爲RealMessageHandler中的handleMessage方法設置SQS偵聽器。

任何線索我會怎麼做?

回答

-1
@TestConfiguration 
@EnableAutoConfiguration(exclude = {MessagingAutoConfiguration.class, CloudAutoConfiguration.class, 
     ContextStackAutoConfiguration.class}) 
public class TestConfig { 

    @Bean 
    public SimpleMessageListenerContainer simpleMessageListenerContainer() { 
     final SimpleMessageListenerContainerFactory factory = new SimpleMessageListenerContainerFactory(); 
     factory.setAutoStartup(false); 
     factory.setAmazonSqs(amazonSQSAsync()); 
     final SimpleMessageListenerContainer simpleMessageListenerContainer = factory 
       .createSimpleMessageListenerContainer(); 
     simpleMessageListenerContainer.setMessageHandler(messageHandler()); 
     return simpleMessageListenerContainer; 
    } 

    @Bean(name = "messageHandler") 
    public QueueMessageHandler messageHandler() { 
     return mock(QueueMessageHandler.class); 
    } 

    @Bean(name = "amazonSQSAsync") 
    public AmazonSQSAsync amazonSQSAsync() { 
     return mock(AmazonSQSAsync.class); 
    } 
} 
+0

造成的:org.springframework.beans.factory.BeanCreationException:錯誤創建名稱爲豆「SimpleMessageListenerContainer一樣」在類路徑資源 –

+0

請添加你的代碼做什麼解釋,以及如何解決問題的定義。僅有代碼的答案不被認爲是好的做法(請參閱文檔) – Yannis

相關問題