No Binaries in the Codebase
Binary data shouldn't be a part of the codebase. This is pretty well-known practice. But how to proceed when we do need binaries in our codebase, for instance as test data?
The solution is straight-forward: Pack binary resources into an artifact separated from the codebase in a repository.
A good practice is to use a special classifier for all the artifacts of this kind, for instance testdata.
After uploading the resources artifact into a repository (manually or via an API), we can use it as a dependency in our codebase (Maven):
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>unpack-test-resources</id>
<phase>process-test-resources</phase>
<goals>
<goal>unpack</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/test-classes</outputDirectory>
<artifactItems>
<artifactItem>
<groupId>com.ttulka.samples.testdata</groupId>
<artifactId>sample-test-resources</artifactId>
<version>1.0.0</version>
<classifier>testdata</classifier>
<type>zip</type>
</artifactItem>
</artifactItems>
</configuration>
</execution>
</executions>
</plugin>
The Maven plugin will download and unpack the resources into the test classpath before the test are actually executed.
Binaries are then available in the codebase (Java):
this.getClass().getResource("/resource1.dat");
Another good practice is to create a domain-based resources structure inside the artifacts. Just put the resources into a sub-folder:
domainA.zip ┕ domainA/ ┕ resource1.dat ┕ resource2.dat
This organization enables composition of resources in the integration testing.
The example code could be found in my GitHub.
Happy resourcing!


