### Question:
Build implements Runnable { public Build(final Configuration configuration) { this.configuration = configuration; } Build(final Configuration configuration); @Override void run();  }### Answer:
@Test void build() throws IOException { final String junitMarker = Test.class.getName().replace('.', '/') + ".class"; final File junitApi = toFile(Thread.currentThread().getContextClassLoader().getResource(junitMarker)); final String osgiCoreMarker = Bundle.class.getName().replace('.', '/') + ".class"; final File osgiCore = toFile(Thread.currentThread().getContextClassLoader().getResource(osgiCoreMarker)); final File output = new File("target/buildtest/build.jar"); if (output.exists()) { output.delete(); } final File workDir = new File(output.getParentFile(), "work"); new Build(new Build.Configuration( workDir, new File("src/test/resources/build"), "test-art", asList(junitApi, osgiCore), singletonList("zip"), Ripener.class.getName(), "bin", "conf", false, false )).run(); final File distro = new File(workDir, "test-art-winegrower-distribution.zip"); assertTrue(distro.exists()); final List<String> entries; try (final JarFile files = new JarFile(distro)) { entries = list(files.entries()).stream().map(JarEntry::getName).collect(toList()); } assertEquals(11, entries.size()); assertTrue(entries.contains("test-art-winegrower-distribution/bin/winegrower.sh")); assertTrue(entries.contains("test-art-winegrower-distribution/bin/setenv.sh")); assertTrue(entries.stream().anyMatch(it -> it.startsWith("test-art-winegrower-distribution/lib/osgi.core-"))); assertTrue(entries.stream().anyMatch(it -> it.startsWith("test-art-winegrower-distribution/lib/junit-jupiter-api-"))); }