1

Ошибка, которую я получаю, связана с анализом свойств перед введением в класс Test. Я в итоге получаю ${property.name}, когда свойство вводится. Однако конфигурация класса Test кажется очень неправильной, учитывая наличие вложенных зависимостей.Как настроить вложенную зависимость для весенних тестов?

Специфическая ошибка: Caused by: java.net.URISyntaxException: Illegal character in authority at index 8: https://${sqs.endpoint}

У меня есть класс конфигурации, чтобы загрузить определенную опору для @Bean:

@Configuration 
public class AWSConfig { 

    private static final Logger LOGGER = LoggerFactory.getLogger(AWSConfig.class); 
    private @Value("${sqs.endpoint}") String endpoint; 

    @Bean(name = "awsClient") 
    @Primary 
    public AmazonSQSAsyncClient amazonSQSClient() { 
     AmazonSQSAsyncClient awsSQSAsyncClient 
       = new AmazonSQSAsyncClient(); 

     awsSQSAsyncClient.setEndpoint(endpoint); 
     return awsSQSAsyncClient; 
    } 
} 

Вот где этот @Bean впрыскивается:

@Component 
public class SqsQueueSender { 

    private static final Logger LOGGER = LoggerFactory.getLogger(SqsQueueSender.class); 
    private final QueueMessagingTemplate queueMessagingTemplate; 

    @Autowired 
    @Qualifier("awsClient") 
    AmazonSQSAsyncClient amazonSQSAsyncClient; 

    public SqsQueueSender(AmazonSQSAsync amazonSQSAsyncClient) { 
     this.queueMessagingTemplate = new QueueMessagingTemplate(amazonSQSAsyncClient); 
    } 

    //take advantage of convertAndSend to send POJOs in appropriate format 
    public void send(String queueName, String message) { 
     this.queueMessagingTemplate.convertAndSend(queueName, MessageBuilder.withPayload(message).build()); 
    } 
} 

Этот все, похоже, работает, по крайней мере, приложение запускает и печатает журналы из любого места. Однако я не могу выполнить единичный тест, который работает против этого кода. Я не могу понять, как правильно настроить конфигурацию. Вот последняя итерация тестового класса:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(loader=AnnotationConfigContextLoader.class) 
public class SqsQueueSenderTest { 

    @Configuration 
    static class ContextConfiguration { 

     private @Value("${sqs.endpoint}") String endpoint; 

     @Bean(name = "awsClient") 
     @Primary 
     public AmazonSQSAsyncClient amazonSQSClient() { 
      AmazonSQSAsyncClient awsSQSAsyncClient 
        = new AmazonSQSAsyncClient(); 

      awsSQSAsyncClient.setEndpoint(endpoint); 
      return awsSQSAsyncClient; 
     } 

     @Bean 
     public SqsQueueSender sqsQueueSender() { 
      SqsQueueSender sqsQueueSender = new SqsQueueSender(amazonSQSClient()); 

      // set up the client 
      return sqsQueueSender; 
     } 
    } 

    @Autowired 
    SqsQueueSender sqsQueueSender;// = new SqsQueueSender(new AmazonSQSAsyncClient()); 


    private static final Logger LOGGER = LoggerFactory.getLogger(SqsQueueSenderTest.class); 

    // attributes for in-memory sqs server 
    AmazonSQSClient client; 
    SQSRestServer server; 
    SQSRestServerBuilder sqsRestServerBuilder; 


    @Before 
    public void startup() { 
     LOGGER.info("Building in-memory SQS server"); 
     this.server = sqsRestServerBuilder.withPort(9324).withInterface("localhost").start(); 
     this.client = new AmazonSQSClient(new BasicAWSCredentials("x", "x")); 
     client.setEndpoint("http://localhost:9324"); 
     client.createQueue("test"); 
     LOGGER.info("Finished building in-memory SQS server"); 
    } 

    @After 
    public void shutdown() { 
     LOGGER.info("Stopping in-memory SQS server"); 
     server.stopAndWait(); 
     LOGGER.info("Finished stopping in-memory SQS server"); 
    } 

    @Test 
    public void testSending() { 
     LOGGER.info("~~~~~~~~~~~~~"); 
     sqsQueueSender.send("test", "new message"); 
     LOGGER.info("The current queues are" + client.listQueues().toString()); 
     LOGGER.info("~~~~~~~~~~~~~"); 
    } 
} 

ответ

1

Джо, в первую очередь поставить свои свойства соединения в качестве ресурса для тестирования:

src/test/resouces/test.properties 

Затем добавить это определение теста:

@PropertySource(
      value={"classpath:test.properties"}, 
@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(loader=AnnotationConfigContextLoader.class) 
public class SqsQueueSenderTest { 

И, наконец, в своем классе конфигурации добавить компонент:

@Configuration static class ContextConfiguration { 

    @Bean 
    public static PropertySourcesPlaceholderConfigurer properties() throws Exception { 
      return new PropertySourcesPlaceholderConfigurer(); 
    } 
} 

Не забудьте поместить на место URL 'sqs.endpoint' в вашем файле свойств.

Это, на мой взгляд, один из самых чистых способов впрыскивания ваших свойств в класс испытаний.

+0

Спасибо, но я фактически поместил 'PropertySource' во внутренний класс' @ Configuration' и фактически должен был создать новый файл реквизита в каталоге 'test/resources'. –

+0

Вот что я имел в виду в тестовом файле :). И да, вы можете поместить аннотацию также на сам фасоль. В любом случае, рад, что это сработало для вас –