2017-01-23 99 views
1

我有一個SqsQueueSender將消息發送給AWS。我想測試這個類。我的想法是,它應該是一個@Component,它被注入到需要它的類中。重要的是,我想將SqsQueueSender的端點配置爲在測試與生產環境中不同。如何正確配置@Component類

我一直在各種不同的方式移動@Autowired和@Component類,但必須有一些基本的誤解。這裏是我的最新配置:

package com.foo.fulfillmentApi.dao; 

import com.amazonaws.services.sqs.AmazonSQSAsyncClient; 
import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.beans.factory.annotation.Value; 
import org.springframework.cloud.aws.messaging.core.QueueMessagingTemplate; 
import org.springframework.messaging.support.MessageBuilder; 

@Component 
public class SqsQueueSender { 

    private static final Logger LOGGER = LoggerFactory.getLogger(SqsQueueSender.class); 
    private final QueueMessagingTemplate queueMessagingTemplate; 

    @Autowired 
    AmazonSQSAsyncClient amazonSQSAsyncClient; 

    //This value is from /resources/application.properties 
    private @Value("${sqs.endpoint}") String endpoint; 

    public SqsQueueSender(AmazonSQSAsyncClient amazonSqsAsyncClient) { 
     amazonSqsAsyncClient.setEndpoint(endpoint); 
     this.queueMessagingTemplate = new QueueMessagingTemplate(amazonSqsAsyncClient); 
    } 

    public void send(String queueName, String message) { 
     this.queueMessagingTemplate.convertAndSend(queueName, MessageBuilder.withPayload(message).build()); 
    } 
} 

錯誤消息對引起啓動狀態

: org.springframework.beans.factory.NoSuchBeanDefinitionException:無類型 「com.amazonaws的 合格的豆。 services.sqs.AmazonSQSAsyncClient'available:expected 至少有1個bean,它們有資格作爲autowire候選者。依賴 註解:{}

要實現SqsQueueSender你必須通過一個AmazonSQSAsyncClient。我如何確保此組件可以訪問該類型的現有bean?

+0

對aws不瞭解。但'AmazonSQSAsyncClient'定義是一個bean在哪裏? – Patrick

+0

如果我理解你的問題,那麼這個類在我的項目中沒有被定義爲@ @ Bean。你如何從你導入的現有類創建@Bean? –

回答

1

您需要創建一個配置類。在你的情況下,它會是這樣的:

@Configuration 
public class AWSConfig { 

    @Bean(name ="awsClient") 
    public AmazonSQSAsync amazonSQSClient() { 
    AmazonSQSAsyncClient awsSQSAsyncClient 
      = new AmazonSQSAsyncClient(); 

    // set up the client 

    return awsSQSAsyncClient; 
} 

如果它與注入再加入預選賽中qsQueueSender問題:

@Autowired 
@Qualifier("awsClient") 
AmazonSQSAsyncClient amazonSQSAsyncClient; 

你也可以做到這一點使用XML配置,但是當你正在使用註釋,那麼這是更可取的方法。

+0

謝謝。我的應用程序現在開始我仍然無法對使用'Client'的類進行測試。我如何在我的測試類中實例化一個'SqsQueueSender'實例? –

+0

你使用Junit的測試框架是什麼? –

+0

是的,測試框架是Junit。 –

0

在com.amazonaws.services.sqs.AmazonSQSAsyncClient中添加@ Component/@ Service或從配置類返回使用@Bean註釋的對象。

+0

Re:「使用配置類中的@Bean註釋返回該對象。」這是否意味着要創建一個用@Bean註釋的類來描述如何構建一個'AmazonSQSAsyncClient'?如果AmazonSQSAsyncClient是一個具體的類,我該如何實現? –