当前位置: 首页 > 知识库问答 >
问题:

测试spring cloud SQS Listener的问题

相云
2023-03-14
    null

我正在尝试为SQS编写一个集成测试。

我有一个本地运行的localstack docker容器,其中SQS在TCP/4576上运行

在我的测试代码中,我定义了一个endpoint设置为Local4576的SQS客户机,它可以成功地连接和创建队列、发送消息和删除队列。我还可以使用SQS客户机接收消息并拾取我发送的消息。

我的问题是,如果我为了允许另一个组件获得消息而删除了正在手动接收消息的代码,似乎什么也不会发生。我有一个spring组件注释如下:

@Component
public class MyListener {
@SqsListener(value = "my_queue", deletionPolicy = ON_SUCCESS)
    public void receive(final MyMsg msg) {
        System.out.println("GOT THE MESSAGE: "+ msg.toString());
    }
}
@RunWith(SpringRunner.class)
@SpringBootTest(properties = "spring.profiles.active=test")
public class MyTest {

    @Autowired
    private AmazonSQSAsync amazonSQS;

    @Autowired
    private SimpleMessageListenerContainer container;

    private String queueUrl;

    @Before
    public void setUp() {
        queueUrl = amazonSQS.createQueue("my_queue").getQueueUrl();
    }

    @After
    public void tearDown() {
        amazonSQS.deleteQueue(queueUrl);
    }

    @Test
    public void name() throws InterruptedException {
        amazonSQS.sendMessage(new SendMessageRequest(queueUrl, "hello"));
        System.out.println("isRunning:" + container.isRunning());
        System.out.println("isActive:" + container.isActive());
        System.out.println("isRunningOnQueue:" + container.isRunning("my_queue"));
        Thread.sleep(30_000);
        System.out.println("GOT MESSAGE: " + amazonSQS.receiveMessage(queueUrl).getMessages().size());
    }

    @TestConfiguration
    @EnableSqs
    public static class SQSConfiguration {

        @Primary
        @Bean(destroyMethod = "shutdown")
        public AmazonSQSAsync amazonSQS() {
            final AwsClientBuilder.EndpointConfiguration endpoint = new AwsClientBuilder.EndpointConfiguration("http://127.0.0.1:4576", "eu-west-1");
            return new AmazonSQSBufferedAsyncClient(AmazonSQSAsyncClientBuilder
                    .standard()
                    .withCredentials(new AWSStaticCredentialsProvider(new BasicAWSCredentials("key", "secret")))
                    .withEndpointConfiguration(endpoint)
                    .build());
        }
    }
}

在我看到的测试日志中:

O.S.C.A.M.Listener.QueueMessageHandler:在类MyListener上找到1个消息处理程序方法:{public void MyListener.Receive(MyMsg)=org.SpringFramework.Cloud.aws.Messaging.Listener.QueueMessageHandler$MappingInformation@1CD4082A}2018-05-31 22:50:39.582 INFO 16329---

O.S.C.A.M.Listener.QueueMessageHandler:将“org.springframework.cloud.aws.messaging.listener.QueueMessageHandler$MappingInformation@1CD4082A”映射到公共void MyListener.Receive(MyMsg)

紧随其后的是:

ISRunning:True

ISActive:True

我还设置了

logging.level.org.apache.http=DEBUG
logging.level.org.springframework.cloud=DEBUG

在我的测试属性中,可以看到HTTP调用创建队列、发送消息和删除等,但没有HTTP调用要接收(除了我在测试结束时的手动调用)。

共有1个答案

方心思
2023-03-14

我是在修修补补之后才想出来的。

即使简单的消息容器工厂被设置为不自动启动,它似乎也会进行初始化,这涉及到确定队列是否存在。

在本例中,队列是在setup方法中在我的测试中创建的--但遗憾的是,这是在spring上下文设置之后,这意味着发生了异常。

@Bean(destroyMethod = "shutdown")
        public AmazonSQSAsync amazonSQS() {
            final AwsClientBuilder.EndpointConfiguration endpoint = new AwsClientBuilder.EndpointConfiguration("http://localhost:4576", "eu-west-1");
            final AmazonSQSBufferedAsyncClient client = new AmazonSQSBufferedAsyncClient(AmazonSQSAsyncClientBuilder
                    .standard()
                    .withCredentials(new AWSStaticCredentialsProvider(new BasicAWSCredentials("dummyKey", "dummySecret")))
                    .withEndpointConfiguration(endpoint)
                    .build());
            client.createQueue("test-queue");
            return client;
        }
 类似资料:
  • 我得到低于错误,而运行基准测试使用与默认设置的标尺。 <17:26:41>未能设置基准驱动程序(将关闭并退出)。类org.apache.ignite.igniteCheckedException:无法启动管理器:GridManagerAdapter[enabled=true,name=org.apache.ignite.internal.managers.discovery.gridDiscove

  • 在为 Glide 报告 bug 的时候,如果您能同时提供一个 Pull Request 包含失败的测试用例 (failing test case) 以演示你正在报告的问题,会对我们很有帮助。失败测试用例可以协助避免交流问题,使维护者容易复现问题,并可在一定程度上提供在将来不再复现该问题的一些保障。 这个指南将手把手地带您撰写一个失败测试用例。 初始化设置 在编写任何代码之前,你需要有少许的一些前置

  • 1.讲述一下之前做项目的测试流程。 2.介绍一下你参与过的一个项目,你找出的印象最深的bug.你在这个项目中担任什么?收获到了什么? 3.你是怎么编写测试用例的?有没有主持过测试用例评审会?怎么主持测试用例评审? 4.怎么定位问题是属于前端还是后端的? 5.你是怎么做压力测试的? 安全性测试的 6.有没有做过APP测试。 7.如果有个bug开发却认为不是bug,你该怎么办? 8.你是怎么做回归测试

  • 我试图学习如何在spring中使用Java8进行单元测试/mockito测试,但遇到了一些问题。我试图测试我的方法findUserById,但它一直运行false。可选类型问题是一个问题,但可能已经解决了这些问题。然而,它仍然是错误的。我的其他测试都是有效的,所以这只是一个顽固的测试。我将感谢你的帮助。

  • 我正在LinuxCLI模式下对两台从机进行远程测试。我已经在主机和从机上设置了如下的rmi端口。我可以从主从机远程登录到端口8080/1099,反之亦然。防火墙已为这些端口打开。 jmeter.properties:client.rmi.localport=1099 jmeter.properties:server.rmi.localport=8080 我在主节点和从节点上启动了 jmeter 服

  • 问题内容: 实际上,我有两个有关Android错误的相关问题。我发布了一个应用程序的更新,该应用程序以前可以正常运行,并且可以在Nexus One,G1和模拟器上以当前版本运行。但是,自从上次更新以来,我通过Android市场控制台收到了很多错误日志,并且无法重现该错误。该应用程序非常简单,只有两个活动,因此手动测试该应用程序应该非常容易。但是,在发布之前,经常会发现一些我找不到的错误。 所以第一