As I was refactoring some JUnit tests recently I was reminded of an important fact on the proper way to read in a file.
In maven any file under
/src/test/resources is automatically copied over to
/target/test-classes. So for example lets say I need to read in a wsdl in my test. So I place the wsdl in the resources folder:
/src/test/resources/test.wsdl. Now at first it might be tempting to reference the file with the following code:
File testWsdl = new File("/src/test/resources/test.wsdl");
and this will actually work on a windows machine; but what about linux, cygwin, or even solaris. Your next improvement might be to replace the
File testWsdl = new File(File.separator + "src" + File.separator + "test" + File.separator + "resources" + File.separator + "test.wsdl");
This still isn’t the best solution which is presented below:
URL url = this.getClass().getResource("/test.wsdl");
File testWsdl = new File(url.getFile());
Using the class’s resource will locate the file in the test’s classpath, which happens to be
/target/test-classes. And this final solution will work on windows, linux, cygwin, and solaris.
@Autowired private ResourceLoader resourceLoader; resourceLoader.getResource("classpath:xxx/file:xxx");