Тест JUnit приемника Spring Boot RabbitMQ останавливается до завершения - PullRequest
0 голосов
/ 28 апреля 2019

У меня странная ситуация, которую я не понимаю.

У меня есть приложение Spring Boot, использующее RabbitMQ. Он может отправлять и получать сообщения успешно, когда вызывается тестом JUnit. Однако, когда я пытаюсь обработать полученное сообщение (то есть запросить базу данных с полученным ключом), оно просто останавливается.

Вопрос

Как мне остановить процесс?

Когда я ставлю точку отладки, она останавливается, и я вижу, что photoEntity заполняется из базы данных, но затем она завершается примерно через секунду. Я подозреваю, что процесс JUnit завершается до завершения службы.

Например, я получаю следующий вывод консоли:

Received RabbitMQ msg = 3ade07c3-5f45-4aac-8054-0132bc85880b
about to get: photos... 3ade07c3-5f45-4aac-8054-0132bc85880b
got...
Received RabbitMQ msg = 3ade07c3-5f45-4aac-8054-0132bc85880b
about to get: photos... 3ade07c3-5f45-4aac-8054-0132bc85880b
got...

код

Приемник

@Component
public class RabbitMQReceiver {

    @Autowired
    private PhotoStatusProcessorService photoStatusProcessorService;

    @RabbitListener(queues = "${rabbitmq.queuename}")
    public void receive(UUID in) {
        System.out.println("Received RabbitMQ msg = " + in);
        photoStatusProcessorService.processPhotoForId(in);
    }
}

Service

@Component
public class PhotoStatusProcessorService {

    @Autowired
    private PhotoRepository photoRepository;

    public void processPhotoForId(UUID uuid) {
        System.out.println("about to get: photos... "+uuid);
        PhotoEntity photoEntity = photoRepository.getOne(uuid);
        System.out.println("got...");
        System.out.println("got: "+photoEntity);
        try {
            System.out.println("got: "+photoEntity);
            photoEntity.setStatus(PhotoStatus.processing);
            photoRepository.save(photoEntity);
            System.out.println("saved: "+photoEntity);
        } catch (Exception e) {
            photoEntity.setStatus(PhotoStatus.failed);
            photoRepository.save(photoEntity);
        }
    }
}

Репозиторий

//@Repository
public interface PhotoRepository extends JpaRepository<PhotoEntity, UUID> {

}

Конфигурация RabbitMQ

@Configuration
public class RabbitMQConfig {

    ...
    @Profile("receiver")
    @Bean
    public RabbitMQReceiver receiver() {
        return new RabbitMQReceiver();
    }

    @Profile("sender")
    @Bean
    public RabbitMQSender sender() {
        return new RabbitMQSender();
    }
}

JUnit - тест отправляет сообщения в очередь, затем получатель получает их и пытается обработать каждое сообщение, но на этом он останавливается. Обработка пытается обновить репозиторий, но кажется, что это не завершается. Это похоже на завершение теста до завершения обработки полученных сообщений.

@RunWith(SpringRunner.class)
@SpringBootTest(classes = PhotoProcessorJavaApplication.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@ActiveProfiles({"sender", "receiver"})
public class PhotoProcessorJavaApplicationTests {

@Test
public void testProcessPhotos() throws Exception {
    List<UUID> uuids = getAllUuids();
    HttpEntity<List<UUID>> entity = new HttpEntity<List<UUID>>(uuids, headers);
    ResponseEntity<String> response = restTemplate.exchange(
            createURLWithPort("/photos/process"),
            HttpMethod.POST, entity, String.class);
    System.out.println(response);
    assertEquals(200, response.getStatusCodeValue());
}

Нужно ли что-то добавить в JUnit, например, еще один ActiveProfile для Сервиса?

...