Playframework 2.6 [Java]:如何测试控制器

时间:2018-02-25 09:07:40

标签: java playframework

我在应用程序中测试控制器时遇到问题。

首先,我有一个Person类:

public class Person extends Model {

    @Id
    public UUID id;
    public static final Finder<UUID , Person> find = new Finder<>(Person.class);

    @Constraints.Required
    @Constraints.MinLength(0)
    @Constraints.MaxLength(25)
    public String name;

    @Constraints.Required
    @Constraints.MinLength(0)
    @Constraints.MaxLength(25)
    public String lastname;

    @Constraints.Required
    @Constraints.Min(0)
    public int age;

    @OneToMany(mappedBy = "person")
    List<ArticleVersion> version = new ArrayList<>();

}

然后我的PersonController在课程正文中使用@inject

public class PersonController extends Controller {


public FormFactory formFactory = null;

@Inject
public PersonController(FormFactory formFactory) {
    this.formFactory = formFactory;
}


public Result createPerson(){
    final Form<Person> form = formFactory.form(Person.class).bindFromRequest();
    if (form.hasErrors()) {
        return badRequest(form.errorsAsJson());
    }

    Person person = form.get();
    person.save();

    return created(Json.toJson(person));

}

public Result getPerson(String id){
    Person person = Person.find.byId(UUID.fromString(id));
    if (person == null) {
        return notFound("Person not found");
    }

    return ok(Json.toJson(person));
 }
}

我想测试一下createPerson方法,但我不知道应该使用哪种测试方法以及如何使用。我试着看看Play Framework网站上的一些教程,但它对我帮助不大。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

我使用Scala特性在scalatest中测试控制器。

import java.util

import com.fasterxml.jackson.databind.JsonNode
import org.scalatest.FlatSpec
import org.scalatestplus.play.guice.GuiceOneAppPerSuite
import play.mvc.{Http, Result}
import play.test.Helpers

/**
  * Access the Play server as an API using HTTP requests over a test server.
  */
trait APIServer extends FlatSpec with GuiceOneAppPerSuite
{
    /**
      * Track session values.
      */
    var session: Http.Session = new Http.Session(new util.HashMap[String, String]())

    /**
      * Execute a request to the server.
      *
      * @param uri     The path of the request
      * @param method  The HTTP method
      * @param request The request data as JsonNode
      * @return The result as a Play Result object
      */
    def request(uri: String, method: String, request: Option[JsonNode]): Result =
    {
        val req: Http.RequestBuilder = Helpers.fakeRequest(method, uri).session(session)

        if (request.isDefined)
        {
            req.bodyJson(request.get)
        }

        Helpers.route(this.app.asJava, req)
    }

}

答案 1 :(得分:0)

使用Play Test Helpers,您可以用这种方式测试整个路线:

import org.junit.Test;
import play.test.TestBrowser;

import static play.test.Helpers.*;

public class IntegrationTest
{

    @Test
    public void test(){
        running(fakeApplication(inMemoryDatabase()), () -> {
            final TestBrowser testBrowser = testBrowser();
            testBrowser.goTo("/api/call/");
            assert(testBrowser.pageSource().equals("API response"));
        });
    }
}