【问题标题】:How to do Junit Test with Google Cloud Pub/Sub如何使用 Google Cloud Pub/Sub 进行 Junit 测试
【发布时间】:2015-10-22 17:40:28
【问题描述】:

我在我的系统中使用 Google Cloud Pub/Sub 的 push pub/sub,我想构建我的 CI 测试代码,但我不知道该怎么做。例如,一些代码是这样的:

final Pubsub pubsub = PubsubUtils.getClient();
final PubsubMessage pubsubMessage = new PubsubMessage();

pubsubMessage.encodeData(message.getBytes(StandardCharsets.UTF_8));
Map<String, String> attrs = new HashMap<String, String>();
attrs.put("key", "value");
pubsubMessage.setAttributes(attrs);

final List<PubsubMessage> messages = ImmutableList.of(pubsubMessage);
final PublishRequest publishRequest = new PublishRequest().setMessages(messages);
        final PublishResponse publishResponse = pubsub.projects().topics().publish(topic, publishRequest).execute();
        final List<String> messageIds = publishResponse.getMessageIds();

还有这个:

final ServletInputStream reader = request.getInputStream();
        try {
            // Parse the JSON message to the POJO model class.
            final JsonParser parser = JacksonFactory.getDefaultInstance().createJsonParser(reader);

            parser.skipToKey("message");

            final PubsubMessage message = parser.parseAndClose(PubsubMessage.class);

            Map<String, String> attrs = message.getAttributes();
            String value = attrs.get("key");

            // Base64-decode the data and work with it.
            final String data = new String(message.decodeData(), StandardCharsets.UTF_8);
            if (data != null || StringUtils.isNotEmpty(data)) {
                Logger.getLogger("logger").info(data);
            }
            // Work with your message
            // Respond with a 20X to acknowledge receipt of the message.
            response.setStatus(HttpServletResponse.SC_OK);
        } finally {
            reader.close();
        }

如何为这两部分代码编写一个正常的Junit测试用例?而且,我正在使用 PowerMockito 来模拟对象。

希望有人可以帮助我。

【问题讨论】:

    标签: google-cloud-pubsub


    【解决方案1】:

    对于第一个示例的单元测试,您可以使用 API 调用所需的返回值模拟 Pub/Sub 客户端对象,例如:

    import com.google.api.services.pubsub.Pubsub;
    import com.google.api.services.pubsub.Pubsub.Projects;
    import com.google.api.services.pubsub.Pubsub.Projects.Topics;
    import com.google.api.services.pubsub.Pubsub.Projects.Topics.Create;
    import com.google.api.services.pubsub.Pubsub.Projects.Topics.Publish;
    // ...
    @Mock private Pubsub mockPubsub;
    @Mock private Projects mockProjects;
    @Mock private Topics mockTopics;
    @Mock private Create mockCreate;
    @Mock private Publish mockPublish;
    // ...
    String topicName = "projects/myproject/topics/mytopic";
    String messageId = "messageId";
    List<String> messageIds = ImmutableList.of(messageId);
    PublishResponse publishResponse = new PublishResponse()
            .setMessageIds(messageIds);
    
    when(mockPubsub.projects()).thenReturn(mockProjects);
    when(mockProjects.topics()).thenReturn(mockTopics);
    when(mockTopics.publish(eq(topicName), isA(PublishRequest.class)))
            .thenReturn(mockPublish);
    when(mockPublish.execute()).thenReturn(publishResponse);
    

    对于第二个示例,您可以模拟 HttpServletRequestHttpServletResponse,然后使用这些模拟对象调用 servlet。

    【讨论】:

    • 是的,第二个例子我已经做了,第一个例子还在进行中。
    • 我认为第一个例子可以正常工作。谢谢!
    猜你喜欢
    • 2022-01-13
    • 2016-11-30
    • 2019-11-12
    • 2021-12-12
    • 1970-01-01
    • 2017-11-27
    • 1970-01-01
    • 2021-02-21
    • 2019-07-26
    相关资源
    最近更新 更多