How to get test helper code properly injected
jrhite_boss Aug 1, 2013 2:09 AMI'm using maven and Arquillian to run tests in a JBoss container.
I have a test which works fine...
@RunWith(Arquillian.class)
public class UserAccessTest extends DatabaseTest {
@Inject UserAccess userAccess;
@Inject SiteAccess siteAccess;
@Test
public void newUser() {
String serverName = randomAlphanumeric(12);
Site site = new SiteBuilder().withServerName(serverName).build();
Site persistedSite = siteAccess.createSite(site);
String email = randomEmail();
String password = randomAlphanumeric(12);
User user = new UserBuilder().withEmail(email)
.withPassword(password)
.withSite(persistedSite)
.build();
userAccess.createUser(user);
User persistedUser = userAccess.getUserByEmail(email);
assertNewEntity(persistedUser);
assertUsersEqual(user, persistedUser);
}
but this is a User test, not a Site test, so I'd very much like to remove details about creating and peristing a Site. To do this I've written a SitePersistentBuiilder class which extends an autogenerated SiteBuilder class (using @GeneratePojoBuilder) and adds a single persist method. The SitePersistentBuiilderclass lives in a package under src/java/test.
@Stateless
public class SitePersistentBuilder extends SiteBuilder {
@Inject SiteAccess siteAccess;
public Site persist() {
return siteAccess.createSite(build());
}
}
Now I can just change my test to:
@RunWith(Arquillian.class)
public class UserAccessTest extends DatabaseTest {
@Inject UserAccess userAccess;
@Test
public void newUser() {
String serverName = randomAlphanumeric(12);
Site site = ((SitePersistentBuilder) new SitePersistentBuilder().withServerName(serverName)).persist();
String email = randomEmail();
String password = randomAlphanumeric(12);
User user = new UserBuilder().withEmail(email)
.withPassword(password)
.withSite(site)
.build();
userAccess.createUser(user);
User persistedUser = userAccess.getUserByEmail(email);
assertNewEntity(persistedUser);
assertUsersEqual(user, persistedUser);
}
Eliminating many details about site creation and peristence (admittedly in this trivial example it doesn't seem like much).
The problem is my SitePersistentBuilder class doesn't get injected with SiteAccess. What is wrong with this example?
Also more generally, is this a test pattern that seems reasonable? At some point I've eventually like to create persistent test data by using something like:
@UsingDataSet
(
"datasets/sites.yml"
)
But I still feel like having persistent entity builders in addition to (non-persistent) entity builders will come in handy.
Thanks.