2017-01-23 9 views
1

私はAWSにメッセージを送信するSqsQueueSenderを持っています。私はこのクラスをテストしたい。私の考えは、それが必要なクラスに注入されるのは@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:タイプ なし 予選Beanのcom.amazonawsここでは私の最新の設定です。 services.sqs.AmazonSQSAsyncClient 'available:expected autowire候補となる少なくとも1つのbean。依存関係 注釈:{}

あなたがAmazonSQSAsyncClientを渡す必要がありSqsQueueSenderを実装します。このコンポーネントがそのタイプの既存のBeanにアクセスできるようにするにはどうすればよいですか?

+0

awsについて何も知らない。しかし、 'AmazonSQSAsyncClient'定義はどこのbeanですか? – Patrick

+0

あなたの質問が分かっていれば、そのクラスは私のプロジェクトで '@ Bean'として定義されていません。インポートした既存のクラスから@Beanを作成するにはどうすればよいですか? –

答えて

1

設定クラスを作成する必要があります。それは注入に問題がある場合は、qsQueueSenderに修飾子を追加

@Configuration 
public class AWSConfig { 

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

    // set up the client 

    return awsSQSAsyncClient; 
} 

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

ます。また、XML設定を使用して、これを行うことができますが、使用しているとして、あなたのケースでは、このようなものになるだろうアノテーションは、これはより適切なアプローチです。

+0

ありがとうございます。私のアプリは今始まる。私はまだ 'Client'を使うクラスに対してテストを実行できません。私のテストクラスで 'SqsQueueSender'のインスタンスをどのようにインスタンス化しますか? –

+0

Junitを使用しているテストフレームワークは何ですか? –

+0

はい、テストフレームワークはJunitです。 –

0

@ Component/@ Serviceをcom.amazonaws.services.sqs.AmazonSQSAsyncClientに追加するか、コンフィグレーションクラスから@Beanアノテーションを使用してそのオブジェクトを返します。

+0

Re: "設定クラスから@Beanアノテーションを使ってそのオブジェクトを返します。"それは、 'AmazonSQSAsyncClient'を構築する方法を記述する@Beanでアノテーション付けされたクラスを作成することを意味しますか? AmazonSQSAsyncClientが具象クラスである場合、これをどのように達成するのですか? –

関連する問題