Spring boot тестирование с аргументами из консоли
Я написал тесты для приложения на буте ,однако он не видит аргумент, который я ему передаю. В исходное приложение аргументы передаются так : java -jar application.jar /path/to/file.csv, где /path/to/file.csv – путь до файла с правилами конвертации
@ContextConfiguration(classes = Application.class)
@SpringBootTest(
classes = Application.class,
args = {"src/test/resources/test.csv"})
@AutoConfigureMockMvc
class ConvertControllerTest {
@Autowired private MockMvc mockMvc;
@Test
void convert() throws Exception {
RequestBuilder requestBuilder =
MockMvcRequestBuilders.post("/convert")
.content("{\n" + " \"from\": \"м/ с\",\n" + " \"to\": \"км /час\"\n" + "}")
.contentType(MediaType.APPLICATION_JSON);
MvcResult result = mockMvc.perform(requestBuilder).andReturn();
assertEquals("3.6", result.getResponse().getContentAsString());
}
Как видно, аргумент передаётся через параметры args;
У меня есть бины, которые инициализируются в AppConfig:
@Configuration
public class AppConfig {
@Value("${additional.filename:systemCsv}")
private String path;
@Bean
public FileRuleReader fileRuleReader() {
return new FileRuleReader();
}
@Bean
public RuleCreater ruleCreater() {
RuleCreater nodeCreater =
new RuleCreater(fileRuleReader().read(new File(Application.filePath)));
nodeCreater.setAdditionalFilePath(path);
return nodeCreater;
}
}
Тут стоит обратить внимание на Application.filePath , где filepath - это тот самый аргумент, который передаётся из cli
И сам Application:
@Slf4j
@SpringBootApplication
@Import(AppConfig.class)
public class Application implements ApplicationRunner {
@Autowired private static final ReconTool reconTool = new ReconTool();
public static String filePath = "test.csv";
public static void main(String[] args) {
reconTool.run(args);
SpringApplication.run(Application.class, args);
}
@Override
public void run(ApplicationArguments args) {
log.info("PATH TO FILE FROM APPLICATION ARGUMENTS - {}", args.getSourceArgs());
filePath = Paths.get(args.getSourceArgs()[0]).normalize().toAbsolutePath().toString();
log.info("Finale path to file{}", filePath);
}
@Component
public static class ReconTool implements CommandLineRunner {
@Override
public void run(String... args) {
log.info("PATH TO FILE FROM CLR - {}", args);
filePath = Paths.get(args[0]).normalize().toAbsolutePath().toString();
log.info("Finale path to file{}", filePath);
}
}
}
Я пытался исправить проблему используя CommandLineRunner и ApplicationRunner, однако, как я понял, в моём случае это не подходит. Как видно ниже, один из способов внедряет путь до запуска spring, а второй уже после инициализации бинов. Как можно передать аргумент командной строки в filepath сразу после запуска spring ? Или это вообще не так делается ?
11:43:34.039 [main] INFO ru.itis.Application - PATH TO FILE FROM CLR - C:\Users\xsolla\Desktop\Allwork\UniversityWork2Course\SecondSemester\ConturWork1\src\main\resources\test.csv
11:43:34.044 [main] INFO ru.itis.Application - Finale path to fileC:\Users\xsolla\Desktop\Allwork\UniversityWork2Course\SecondSemester\ConturWork1\src\main\resources\test.csv
11:43:34.290 [restartedMain] INFO ru.itis.Application - PATH TO FILE FROM CLR - C:\Users\xsolla\Desktop\Allwork\UniversityWork2Course\SecondSemester\ConturWork1\src\main\resources\test.csv
11:43:34.290 [restartedMain] INFO ru.itis.Application - Finale path to fileC:\Users\xsolla\Desktop\Allwork\UniversityWork2Course\SecondSemester\ConturWork1\src\main\resources\test.csv
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.4.3)
2021-03-27 11:43:34.967 INFO 22320 --- [ restartedMain] ru.itis.Application : Starting Application using Java 15.0.1 on LAPTOP-TTFM6CUT with PID 22320 (C:\Users\xsolla\Desktop\Allwork\UniversityWork2Course\SecondSemester\UniveresalConverter\target\classes started by xsolla in C:\Users\xsolla\Desktop\Allwork\UniversityWork2Course\SecondSemester\UniveresalConverter)
2021-03-27 11:43:34.969 INFO 22320 --- [ restartedMain] ru.itis.Application : No active profile set, falling back to default profiles: default
2021-03-27 11:43:35.042 INFO 22320 --- [ restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable
2021-03-27 11:43:35.042 INFO 22320 --- [ restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG'
2021-03-27 11:43:36.416 INFO 22320 --- [ restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 80 (http)
2021-03-27 11:43:36.428 INFO 22320 --- [ restartedMain] o.apache.catalina.core.StandardService : Starting service [Tomcat]
2021-03-27 11:43:36.429 INFO 22320 --- [ restartedMain] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.43]
2021-03-27 11:43:36.537 INFO 22320 --- [ restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2021-03-27 11:43:36.537 INFO 22320 --- [ restartedMain] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1493 ms
2021-03-27 11:43:36.600 INFO 22320 --- [ restartedMain] f.a.AutowiredAnnotationBeanPostProcessor : Autowired annotation is not supported on static fields: private static final ru.itis.Application$ReconTool ru.itis.Application.reconTool
2021-03-27 11:43:36.832 INFO 22320 --- [ restartedMain] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor'
2021-03-27 11:43:37.144 WARN 22320 --- [ restartedMain] o.s.b.a.f.FreeMarkerAutoConfiguration : Cannot find template location(s): [classpath:/templates/] (please add some templates, check your FreeMarker configuration, or set spring.freemarker.checkTemplateLocation=false)
2021-03-27 11:43:37.192 INFO 22320 --- [ restartedMain] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729
2021-03-27 11:43:37.256 INFO 22320 --- [ restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 80 (http) with context path ''
2021-03-27 11:43:37.273 INFO 22320 --- [ restartedMain] ru.itis.Application : Started Application in 2.967 seconds (JVM running for 4.091)
2021-03-27 11:43:37.277 INFO 22320 --- [ restartedMain] ru.itis.Application : PATH TO FILE FROM APPLICATION ARGUMENTS - C:\Users\xsolla\Desktop\Allwork\UniversityWork2Course\SecondSemester\ConturWork1\src\main\resources\test.csv
2021-03-27 11:43:37.277 INFO 22320 --- [ restartedMain] ru.itis.Application : Finale path to fileC:\Users\xsolla\Desktop\Allwork\UniversityWork2Course\SecondSemester\ConturWork1\src\main\resources\test.csv
2021-03-27 11:43:37.277 INFO 22320 --- [ restartedMain] ru.itis.Application : PATH TO FILE FROM CLR - C:\Users\xsolla\Desktop\Allwork\UniversityWork2Course\SecondSemester\ConturWork1\src\main\resources\test.csv
2021-03-27 11:43:37.277 INFO 22320 --- [ restartedMain] ru.itis.Application : Finale path to fileC:\Users\xsolla\Desktop\Allwork\UniversityWork2Course\SecondSemester\ConturWork1\src\main\resources\test.csv