My test class, named GeneralTest:
public class GeneralTest {
@Inject
Application application;
private final AccountService accountServiceMock = mock(AccountService.class);
@Before
public void setup() {
Module testModule = new AbstractModule() {
@Override
public void configure() {
bind(AccountService.class).toInstance(accountServiceMock);
}
};
GuiceApplicationBuilder builder = new GuiceApplicationLoader()
.builder(new ApplicationLoader.Context(Environment.simple()))
.overrides(testModule);
Guice.createInjector(builder.applicationModule()).injectMembers(this);
Helpers.start(application);
}
@After
public void teardown() {
Helpers.stop(application);
}
@Test
public void testLogin() throws SQLException {
RequestBuilder request = new RequestBuilder()
.uri(routes.LoginController.login().url());
running(application, () -> {
assertEquals(OK, route(request).status());
});
}
@Test
public void testCreateAccount() throws SQLException {
RequestBuilder request = new RequestBuilder()
.uri(routes.CreateController.createAccount().url());
running(application, () -> {
assertEquals(OK, route(request).status());
});
}
}
Everything's fine until I split this GeneralTest into 2 classes, "LoginTest", "CreateAccountTest", having exact same @Before and @After with testLogin() and testCreateAccount() methods respectively, Then the 2nd class's method to be executed will get an InstantiationException:
java.lang.InstantiationException: controllers.CreateController, took 2.656 sec
[error] at java.lang.Class.newInstance(Unknown Source)
[error] at play.api.inject.NewInstanceInjector$.instanceOf(Injector.scala:49)
[error] at router.Routes$$anonfun$routes$1$$anonfun$applyOrElse$15$$anonfun$apply$87.apply(Routes.scala:534)
[error] at router.Routes$$anonfun$routes$1$$anonfun$applyOrElse$15$$anonfun$apply$87.apply(Routes.scala:534)
[error] at play.core.routing.HandlerInvokerFactory$$anon$4.resultCall(HandlerInvoker.scala:136)
[error] at play.core.routing.HandlerInvokerFactory$JavaActionInvokerFactory$$anon$14$$anon$3$$anon$1.invocation(HandlerInvoker.scala:127)
[error] at play.core.j.JavaAction$$anon$1.call(JavaAction.scala:70)
[error] at play.http.DefaultHttpRequestHandler$1.call(DefaultHttpRequestHandler.java:20)
[error] at play.core.j.JavaAction$$anonfun$7.apply(JavaAction.scala:94)
[error] at play.core.j.JavaAction$$anonfun$7.apply(JavaAction.scala:94)
[error] at scala.concurrent.impl.Future$PromiseCompletingRunnable.liftedTree1$1(Future.scala:24)
[error] at scala.concurrent.impl.Future$PromiseCompletingRunnable.run(Future.scala:24)
[error] at play.core.j.HttpExecutionContext$$anon$2.run(HttpExecutionContext.scala:40)
[error] at play.api.libs.iteratee.Execution$trampoline$.execute(Execution.scala:70)
[error] at play.core.j.HttpExecutionContext.execute(HttpExecutionContext.scala:32)
[error] at scala.concurrent.impl.Future$.apply(Future.scala:31)
[error] at scala.concurrent.Future$.apply(Future.scala:492)
[error] at play.core.j.JavaAction.apply(JavaAction.scala:94)
[error] at play.api.mvc.Action$$anonfun$apply$1$$anonfun$apply$6.apply(Action.scala:108)
[error] at play.api.mvc.Action$$anonfun$apply$1$$anonfun$apply$6.apply(Action.scala:108)
[error] at scala.Option.getOrElse(Option.scala:121)
[error] at play.api.mvc.Action$$anonfun$apply$1.apply(Action.scala:107)
[error] at play.api.mvc.Action$$anonfun$apply$1.apply(Action.scala:96)
[error] at play.api.libs.iteratee.Iteratee$$anonfun$mapM$1.apply(Iteratee.scala:524)
[error] at play.api.libs.iteratee.Iteratee$$anonfun$mapM$1.apply(Iteratee.scala:524)
[error] at play.api.libs.iteratee.Iteratee$$anonfun$flatMapM$1.apply(Iteratee.scala:560)
[error] at play.api.libs.iteratee.Iteratee$$anonfun$flatMapM$1.apply(Iteratee.scala:560)
[error] at play.api.libs.iteratee.Iteratee$$anonfun$flatMap$1$$anonfun$apply$13.apply(Iteratee.scala:536)
[error] at play.api.libs.iteratee.Iteratee$$anonfun$flatMap$1$$anonfun$apply$13.apply(Iteratee.scala:536)
[error] at scala.concurrent.impl.Future$PromiseCompletingRunnable.liftedTree1$1(Future.scala:24)
[error] at scala.concurrent.impl.Future$PromiseCompletingRunnable.run(Future.scala:24)
[error] at java.util.concurrent.ForkJoinTask$RunnableExecuteAction.exec(Unknown Source)
[error] at java.util.concurrent.ForkJoinTask.doExec(Unknown Source)
[error] at java.util.concurrent.ForkJoinPool$WorkQueue.runTask(Unknown Source)
[error] at java.util.concurrent.ForkJoinPool.runWorker(Unknown Source)
[error] at java.util.concurrent.ForkJoinWorkerThread.run(Unknown Source)
[error] Caused by: java.lang.NoSuchMethodException: controllers.CreateController.<init>()
[error] at java.lang.Class.getConstructor0(Unknown Source)
[error] ... 36 more
Anyone knows how to overcome this issue? It must be something wrong with my setup, but I'm trying my best to follow the official documentations, which doesn't show how testing with multiple classes should be like.