2017-02-21 20 views
1

Я создаю приложение весенней загрузки. Я хочу, чтобы запустить его, как это:Как передать аргументы программы в @SpringBootTest?

java -jar myjar.jar inputFile outputFile 

Как написать @SpringBootTest для этого? Я полагаю, что использование @SpringBootTest приведет к сбою Spring во время запуска, потому что некоторые из моего кода скажут: «вам нужно предоставить inputFile и outputFile». Есть ли способ передать аргументы программы при использовании @SpringBootTest?

I'm inferring from this answer что мне, возможно, придется использовать SpringApplicationBuilder для этого.

I мысль У меня был ответ, но я был неправ. Это неверная информация еще может быть полезным для некоторых:


(Эта информация неверна, я думаю, что некоторые аргументы не могут быть упомянуты в коде как свойства, но не все, что я до сих пор не знаю.. как получить аргументы приложения в @SpringBootTest) Я был смущен, потому что я не понял терминологию. У аннотации есть параметр для «свойств». Я думал, что это было бы указать его в файле свойств, but the documentation says:

Свойства в виде ключа = значение, которое должно быть добавлено к Спринг среды перед испытания.

Другой фрагмент терминологической головоломки - это то, что я назвал «программными аргументами», как «весовые» документы, называются «свойствами».

Это некоторая дополнительная соответствующая документация: https://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#boot-features-application-arguments


Это обходной путь (не ответ). Вы можете сделать что-то вроде этого:

private SpringApplicationBuilder subject; 

@Before 
public void setUp() throws Exception { 
    subject = new SpringApplicationBuilder(Application.class); 
} 

@Test 
public void requiresInputAndOutput() throws Exception { 

    thrown.expect(IllegalStateException.class); 
    subject.run(); 
} 

@Test 
public void happyPathHasNoErrors() throws Exception { 

    subject.run(EXISTING_INPUT_FILE, "does_not_exist"); 
} 

Мне это не очень нравится. Это мешает мне использовать @Autowired в другом месте моего теста.

ответ

0

Обычно вы пишите тесты на свои услуги; а не ремнем безопасности. Spring Boot передаст параметры командной строки вашим классам - возможно, используя аннотацию @Value, которая, в свою очередь, будет параметрами для вашей службы. Рассмотрите возможность тестирования своих услуг с помощью SpringRunner. Вот пример из моей базы кода.

@RunWith(SpringRunner.class) 
@ContextConfiguration(classes = { 
    Neo4jConfigTest.class, 
    FdTemplate.class, 
    FdServerIo.class, 
    MapBasedStorageProxy.class}) 
@ActiveProfiles({"dev", "fd-auth-test", "fd-client"}) 
public class TestEntityLinks { 

@Autowired 
private ContentModelService contentModelService; 

@Autowired 
private BatchService batchService; 

@Test 
public void doSomething() { ... } 
+0

Возможно, я не понимаю ваш ответ, но я не знаю, как действовать на нем. Похоже, вы говорите: «Не проверяйте этот способ. Вот как вы должны тестировать * другие * компоненты вашего приложения, хотя». В контексте моего вопроса, я чувствую, что мое обходное решение более полезно. –

+0

Возможно, но кодирование с помощью Spring проще, когда вы следуете соглашениям. Нет необходимости создавать и запускать приложение для теста в том, как вы описываете. SpringRunner создаст контекст приложения и позволит вам авторизовать ваши службы. Аналогично @WebAppConfiguration используется для установления тестового контекста веб-сервера. –

+0

Я хочу проверить, что это ошибки при запуске, если вы не передаете эти аргументы командной строки. –