4.5 KiB
+++ title = "play2" draft = false tags = [ "code", "java", "play2" ] date = "2013-03-12" +++
Play 2.0
Testing in Play 2.0
Controller testen
een controller "action" (= method vanuit route) testen doen we op een "functionele" manier in plaats van de method direct aan te roepen:
controller
public static Result buyHorse() {
Form<Horse> horseForm = form(Horse.class);
Horse horse = horseForm.bindFromRequest().get();
System.out.println(horse.id);
}
unit test
@Test
public void buyHorse() {
HashMap<String, String> map = new HashMap<>();
map.put("id", "12");
callAction(HorseMarket.buyHorse(), new FakeRequest().withFormUrlEncodedBody(map));
}
Waarbij hierboven HorseMarket
de routes ref is en niet de HorseMarket
controller klasse zelf - deze:
import static controllers.routes.ref.HorseMarket;
❗ De bovenstaande test zal "12" afdrukken, gegeven dat setId()
gegenereerd is.
Play2 genereert blijkbaar getters & setters voor EBean Modellen volgens https://github.com/playframework/Play20/wiki/JavaEbean:
Play has been designed to generate getter/setter automatically, to ensure compatibility with libraries that expect them to be available at runtime (ORM, Databinder, JSON Binder, etc). If Play detects any user-written getter/setter in the Model, it will not generate getter/setter in order to avoid any conflict.
Wordt voor testing blijkbaar niet gegenereerd?
Integratie testen en EBean
Zie ook http://blog.matthieuguillermin.fr/2012/03/unit-testing-tricks-for-play-2-0-and-ebean/
De database moet gesetup worden door alles met runningFakeApplication()
te draaien (static onder play.test.Helper
):
@Test
public void save() {
running(fakeApplication(), new Runnable() {
public void run() {
// Here is your real test code
Company company = new Company("My Company");
company.save();
assertThat(company.id).isNotNull();
}
});
}
Dit is heel omslachtig en moet overal in een test gedaan worden. Oplossing: voorzie een static @BeforeClass
dit éénmalig de setup doet:
public class BaseModelTest {
public static FakeApplication app;
@BeforeClass
public static void startApp() {
app = Helpers.fakeApplication(Helpers.inMemoryDatabase());
Helpers.start(app);
}
@AfterClass
public static void stopApp() {
Helpers.stop(app);
}
}
Dan heb je de Runnable
van de eerste code niet meer nodig.
EBean enhancer als javaagent gebruiken
Testen draaien in Eclipse in plaats van in de play2 console kan je doen door -javaagent:/path/to/ebean/ebean-x.y.z-agent.jar
mee te geven met JRE env.
Hiervoor moet je eerst EBean zelf nog downloaden want de agent zit niet in de play2 local repo: http://www.avaje.org/download.html
Setup
- Voor IntelliJ: http://jetbrains.dzone.com/articles/configuring-intellij-idea
- Voor Eclipse: https://groups.google.com/forum/#!topic/play-framework/U44m-kOG3bk
Dependencies
Play 1.2 Dependency management werkt via dependencies.yml
: http://www.playframework.org/documentation/1.2.1/dependency
Play 2.0 werkt met Scala en SBT als dep management: https://github.com/playframework/Play20/wiki/SBTDependencies
SBT staat voor Simple Build Tool <- meer info & vergelijkingen met Gradle, Ivy ea.
Volg de volgende stappen:
- Pas Build.scala aan - zie onder
- Draai in de
play
consoleeclipse
(zoals classpath updating:mvn eclipse:eclipse
)
import sbt._
import Keys._
import PlayProject._
object ApplicationBuild extends Build {
val appName = "main"
val appVersion = "1.0"
val appDependencies = Seq(
"org.easytesting" % "fest-assert" % "1.4" % "test"
// Add your project dependencies here,
)
val main = PlayProject(appName, appVersion, appDependencies).settings(defaultJavaSettings:_*).settings(
// The following line is NOT NEEDED by default!
resolvers += "Maven2 Repository" at "http://repo1.maven.org/maven2"
)
}
Play dependency tree printen gaat ook - voor meer commando's, zie help
in de play
console.
Querying
Gegeven de entiteit:
@Entity
public class Auto {
@Id
public Long id;
}
en de volgende test:
public class AutoIntegrationTest {
@Test
public void canBePersisted() {
new Auto().save();
}
}
In Play 2.0
List<Auto> autos = Ebean.find(Auto.class).findList();
In Play 1.2
List<Auto> autos = Auto.list();