LaunchWrapperTestSuite makes it possible to run JUnit tests that require transformed classes. It provides a custom test runner that will load the test class in a separate LaunchClassLoader
that applies previously configured transformers.
LaunchWrapperTestSuite can be used with any build system. The following examples will use Gradle.
-
Add test dependency on LaunchWrapperTestSuite:
dependencies { testCompile 'org.spongepowered:lwts:1.0.0' }
-
Implement a test tweak class that configures the transformers. LaunchWrapperTestSuite comes with
AbstractTestTweaker
which provides some utility methods and sets up the class loader to work with JUnit.package com.example.test.launch; import net.minecraft.launchwrapper.LaunchClassLoader; import org.spongepowered.lwts.AbstractTestTweaker; public class MyTestTweaker extends AbstractTestTweaker { @Override public void injectIntoClassLoader(LaunchClassLoader loader) { // Important so we can configure some settings for JUnit super.injectIntoClassLoader(loader); // Configure your transformers here (a few examples below) // Access transformer registerAccessTransformer("META-INF/test_at.cfg"); // Mixin environment MixinBootstrap.init(); Mixins.addConfiguration("mixins.test.json"); // Set Mixin side, otherwise you get a warning when running the tests MixinEnvironment.getDefaultEnvironment().setSide(SERVER); // Custom transformer loader.registerTransformer("com.example.test.launch.transformer.MyCustomTransformer"); } }
-
Set a system property
lwts.tweaker
with the full qualified class name of your tweaker:test { systemProperty 'lwts.tweaker', 'com.example.test.launch.MyTestTweaker' // Run tests in a temporary directory workingDir = {test.temporaryDir} }
To make a test class use the custom test runner, all you need to do is add a annotation to it:
@RunWith(LaunchWrapperTestRunner.class)
public class MyTest {
@Test
public void testSomething() {
// ...
}
}
When you run your tests using gradle test
it should load the test class in the custom classloader and apply the configured transformers.
If you are using a parameterized test you need to change the test runner to LaunchWrapperParameterized
:
@RunWith(LaunchWrapperParameterized.class)
public class MyParameterizedTest {
@Parameterized.Parameters
public static Collection<Object[]> getParameters() {
// ...
}
}