3

spring rabbitmq/amqpをモックする方法は、春のブートテスト中に失敗することはありませんが、自動交換/キューを作成しようとしていますか?春のブートテストでspring amqp/rabbitをモックする方法

私はキューと交流の原因になります簡単なRabbitListenerオートはこのように作成する必要があるとします。

@ActiveProfiles("test") 
@RunWith(SpringRunner.class) 
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT, classes = { Application.class }) 

    @Autowired 
    private ApplicationContext applicationContext; 

    @Test 
    public void test() { 
     assertNotNull(applicationContext); 
    } 

} 

それは以下となります。このように、シンプルな春Bootテスト中に

@Component 
@RabbitListener(bindings = { 
     @QueueBinding(
       value = @Queue(value = "myqueue", autoDelete = "true"), 
       exchange = @Exchange(value = "myexchange", autoDelete = "true", type = "direct"), 
       key = "mykey")} 
) 
@RabbitListenerCondition 
public class EventHandler { 
    @RabbitHandler 
    public void onEvent(Event event) { 
     ... 
    } 
} 

を失敗する:

16:22:16.527 [SimpleAsyncTaskExecutor-1] ERROR o.s.a.r.l.SimpleMessageListenerContainer - Failed to check/redeclare auto-delete queue(s). 
org.springframework.amqp.AmqpConnectException: java.net.ConnectException: Connection refused 
    at org.springframework.amqp.rabbit.support.RabbitExceptionTranslator.convertRabbitAccessException(RabbitExceptionTranslator.java:62) 
    at org.springframework.amqp.rabbit.connection.AbstractConnectionFactory.createBareConnection(AbstractConnectionFactory.java:309) 

私はウサギ/ AMQPは気にしませんが、だから、ウサギ/ AMQP全体をどうやって嘲笑することができますか?

答えて

2

特に簡単なことではありませんが、ブローカーが利用できない場合は、通常JUnit @Ruleを使用してテストをスキップします。

しかし、私たちはモックを使用するテストはたくさんありますが、それらを使用するには多くのSpring AMQP内部構造を理解する必要があります。テストケースはproject itselfで調べることができます。

私は偽のブローカーを書こうとしましたが、それはあまりにも多くの仕事をしました。

+0

十分な奇妙な、それは1.5.6で動作するように使用:Mockito.mock(AmqpTemplate.class) - が、今1.6で。1これはもはや動作しません:( – domi

+0

私は正しい場合、これはまた、私はそのような構成を持っているときに私は完全なコンテナで任意のSpringBootテストケースを使用することができないことを意味します:( – domi

+0

テンプレートを嘲笑は十分ですAmqpTemplateはシンプルなインターフェースであり、1.6にはそれをモックする能力が変わっていないことは何もありません。 –

1

私はある時点で同様の要件を満たしていて、メモリ内のAMQPブローカを提供するQPidを調べました。 AMQPレベルにとどまり、可能な限りrabbitMq固有のコードを使用しなくてはなりません。

しかし、私は実際にテスト+自動削除値を実行しているときにキュー名や交換名を調整することで、もう問題を発見していません。テストのすべてのキュー/エクスチェンジ名には、(テストを実行するアカウントの)ユーザー名が付いています。つまり、誰でも自分のマシンでテストを実行できます。

CIパイプラインでも、複数のプロジェクトで同じ交換/キューを使用することがあります。テストでの値をプロジェクト固有に設定するので、2つのプロジェクトが同じマシン上で同時に同じユーザーの場合、メッセージは現在のテストの外側では「リーク」しません。

これは、メモリブローカーを嘲笑したり産んだりするよりもはるかに簡単です。

1

私たちのプロジェクトでは、dockerコンテナをローカルに使用してRabbitMQインスタンスを初期化します。統合テストを実行するには、RabbitMQインスタンスをテストケースの先頭にスピンアップし、クリーンアップ中にシャットダウンします。

私たちはTestContainersを使用しています。 https://www.testcontainers.org/usage/dockerfile.htmlおよび/またはhttps://www.testcontainers.org/usage/docker_compose.htmlをご覧ください。

1

これが役立つかどうかわかりませんが、私は同じ問題を抱えていました。だから、ちょうどを別のプロファイルのRabbitAdminに使いましたが、同じ接続の問題はありませんでした。テスト合格。私はこのように豆を設定する必要がありました -

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE) 
@RunWith(SpringRunner.class) 
@ActiveProfiles("my-test") 
public class ServiceTests { 

@Autowired 
private DummyService unitUnderTest; 

@MockBean 
private RabbitAdmin rabbitAdmin; 

// lots of tests which do not need Spring to Create a RabbitAdmin Bean 
} 
関連する問題