2015-07-31 6 views
2

Я использую push pub/sub Google Cloud Pub/Sub в своей системе, и я хочу создать свой тестовый код CI, но я не знаю, как это сделать it.For Например, некоторые коды, как это:Как выполнить тест Junit с облачной облачной областью Google/Sub

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 для издевательства над объектами.

Надеюсь, кто-то может мне помочь.

ответ

3

Для модульного тестирования первого примера, вы можете дразнить Pub/Sub объект клиента с заданными значениями возвратных для вызовов API, как:

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); 

Для второго примера, вы можете дразнить HttpServletRequest и HttpServletResponse затем вызвать сервлет с этими макетными объектами.

+0

Да, я сделал второй пример, и первый пример продолжается. – xialin

+0

Я думаю, что первый пример может работать отлично. Спасибо! – xialin

+0

Приятно слышать :) –