We write so many tests in our day; it should be easier. Part of the Alchemy Collection, Alchemy Test is a Unit Test Library that makes it easier to test your code by providing syntactic sugar for unit-testing and mocking.
To use, simply add the following maven dependency.
<dependency>
<groupId>tech.sirwellington.alchemy</groupId>
<artifactId>alchemy-test</artifactId>
<version>2.2.1</version>
</dependency>
First add the Snapshot Repository
<repository>
<id>ossrh</id>
<url>https://oss.sonatype.org/content/repositories/snapshots</url>
</repository>
<dependency>
<groupId>tech.sirwellington.alchemy</groupId>
<artifactId>alchemy-test</artifactId>
<version>2.3-SNAPSHOT</version>
</dependency>
In conjunction with JUnit, Throwable assertions make it really easy to write Exception Statements.
Instead of writing all this crap:
try
{
instance.call("badArg");
fail("Expected exception");
}
catch(IllegalArgumentException ex)
{
//This means the test passed
}
You can now just do:
assertThrows(() -> instance.call("badArg"))
.isInstanceOf(IllegalArgumentException.class); //Optional further assertion
So often in tests we do this:
@Test
public void testSomeMethod()
{
//Print out the test name at the beginning
System.out.println("testSomeMethod");
//Rest of the Test Case...
}
Who wants to write the same thing twice? It's especially troublesome when you decide to rename your test name, since you have to remember to update the print statement as well.
AlchemyTestRunner
makes this automatic.
@RunWith(AlchemyTestRunner.class)
public class HttpTests
{
@Test
public void testReponse()
{
//Automatic
//System.out.println("testResponse()");
//FOR FREE
}
}
We even tell you information about the test run:
testRequestReadyEdgeCases()
Duration: 59ms
Runs: 100
testValidContentType()
Duration: 7ms
Runs: 100
Used in conjunction with Alchemy Generator, Alchemy Unit Tests can now easily generate any Data they use
@RunWith(AlchemyTestRunnner.class)
public class ExampleTest
{
@GenerateString
private String name;
@GenerateString(HEXADECIMAL)
private String username;
@GenerateInteger(POSITIVE)
private int points;
@GeneratePojo
private User user;
@GenerateList(String.class)
private List<String> names;
...
}
@GenerateString
@GenerateInteger
@GenerateLong
@GenerateDouble
@GenerateDate
@GenerateInstant
@GenerateURL
@GeneratePojo
@GenerateEnum
@GenerateList
More on the way...
Used in conjunction with Automatic Data Generation
, Repeat Tests can dramatically improve test quality.
@Repeat(1000)
@RunWith(AlchemyTestRunner.class)
public class StringEncryptorTests
{
private String text;
private StringEncryptor instance;
@Before
public void setup()
{
text = one(hexadecimalStrings(10));
instance = new StringEncryptor();
}
@Test
public void testDecrypt()
{
String result = instance.decrypt(text);
//Blah checks
}
}
You can also set the number of repeats on a case by case basis
@Repeat(100)
@RunWith(AlchemyTestRunner.class)
public class StringEncryptorTests
{
private String text;
private StringEncryptor instance;
@Before
public void setup()
{
text = one(alphabeticStrings(10));
instance = new StringEncryptor();
}
//Repeat less often
@Repeat(10)
@Test
public void testEncrypt()
{
String result = instance.encrypt(text);
//Blah checks
}
}
You can also use the @DontRepeat
annotation to prevent a testCase from being repeated entirely.
@DontRepeat
@Test
public void testExecute()
{
//Will run only once
}
By default, we also init your Mockito Mocks for free
@RunWith(AlchemyTestRunner.class)
public class MyTest
{
@Mock
private AlchemyHttp http;
@Mock
private HttpResponse response;
@Before
private void setup()
{
//Mocks are already instantiated
when(http.get())
.thenReturn(response);
}
}
If you want to disable this behavior, simply add:
@InitMocks(false)
to your test class.
// Return the first argument back when the mock is called
when(someMock)
.call(anyString(), anyString())
then(returnFirst());
//verify it works
String result = mock.call("arg1", "arg2");
assertThat(result, is("arg1"));
- Java 8
- Maven 3+
This project builds with maven. Just run a mvn clean install
to compile and install to your local maven repository.
Feature Requests are definitely welcomed! Please drop a note in Issues.
This Software is licensed under the Apache 2.0 License