2016-04-12 15 views
9
aracılığıyla

aracılığıyla Test API'sine genel bir form gönderebileceğimi doğrulamak için testler yazıyorum.Test Formları, MockMVC

Ayrıca bazı hata ayıklamalarını da ekledim, ancak gerçek bir form tarafından gönderilen verilerin farkettim; (Postacı/angularjs veya ağırlık/e) gibi mockMVC test yaparak Farkı:

MvcResult response = mockMvc 
      .perform(post("/some/super/secret/url") // 
        .param("someparam1", "somevalue") // 
        .param("someparam2", "somevalue") //     
        .contentType(MediaType.APPLICATION_FORM_URLENCODED) // 
        .accept(MediaType.APPLICATION_JSON)) // 
      .andExpect(status().isOk()) // 
      .andReturn(); 

yapılandırma tam üretiminde çalışan yapılandırma ve bu aynıdır. Benim önleme gerçek testi (değil mockMVC) içeriği, kaydeder Ancak zaman içerik Ben mockMVC içeriği yazdırırken

Aslında hiçbir içeriğe sahip görünmektedir "someparam1 = birdeğer & vb = encore" gibi biçimlendirilmiş, ama orada olduğunu Params isteminde, GET parametreleri gibi eklendiğini varsayalım.

Bunu düzgün bir şekilde nasıl test edeceğini bilen var mı? FormHttpMessageConverter uygulamasının sunucu içeriğine eklenmiş olmasına rağmen form yazılarımızın Spring tarafından ayrıştırılmamış gibi göründüğü için bu konuya geldim.

+0

config gibi sunucu ve bazı giriş detaylara sonrası gerçek veriler daha net hale getirmek için, daha fazla ayrıntı verebilir misiniz? Sahte hakkında, doğru yaptığınız görünüyor, sahte testi param, gösterdiğiniz posta verilerinin aynı biçimidir. Ayrıca, bahar güvenliği hakkında bir fikir sahibi olup olmadığınızı kontrol edin. Bir sonraki adımı yapmadan önce yaylı güvenlik ile uğraşmak veya giriş yapmak gerekebilir. –

+1

Bunun gibi bir şey kullanmıyoruz, öğrendiğim şey benim örneğimin aslında yanlış olmasıdır. Bu durumda, bazıParam1 ve bazıParam2 bir sorgu parametresi olacaktır, (URL'de). Bu nedenle, form parametrelerini kullanmak istiyorum, URLENCODED. Ancak bu sadece bir model veya bir değer haritası aracılığıyla erişilebilir görünüyor. Bu yüzden bir geçici çözüme ihtiyacımız olacak (bu, ilkbahar olmayan @FormParam için kullanılan tamamen yaylı mvc olmak üzere taşındı). –

+0

Aynı zamanda yayınlanan veriler de, Mvc bölümünün altındaki örneğimde olduğu gibi, & # –

cevap

10

Eğer üzerinde sınıf Apache HttpComponents HttpClient varsa, bunu şöyle yapabilirsiniz:

mockMvc.perform(post("/some/super/secret/url") 
      .contentType(MediaType.APPLICATION_FORM_URLENCODED) 
      .content(EntityUtils.toString(new UrlEncodedFormEntity(Arrays.asList(
        new BasicNameValuePair("someparam1", "true"), 
        new BasicNameValuePair("someparam2", "test") 
      ))))); 

sen HttpClient yoksa, sen urlencoded formunu oluşturur basit bir yardımcı yöntem ile bunu yapabilir varlık:

mockMvc.perform(post("/some/super/secret/url") 
      .contentType(MediaType.APPLICATION_FORM_URLENCODED) 
      .content(buildUrlEncodedFormEntity(
     "someparam1", "value1", 
     "someparam2", "value2" 
    )))); 

Bu yardımcı fonksiyonu ile:

String buildUrlEncodedFormEntity(String... params) { 
    if((params.length%2)>0) { 
     throw new IllegalArgumentException("Need to give an even number of parameters"); 
    } 
    StringBuilder result = new StringBuilder(); 
    for(int i=0; i<params.length; i+=2) { 
     if(i>0) result.append('&'); 
     result.append(URLEncoder.encode(params[i]) 
      .append('=') 
      .append(URLEncoder.encode(params[i+1]); 
    } 
    return result.toString(); 
} 
+0

Bu en iyisi değil, ama bir çözüm. Apache HTTPComponents'a neden ihtiyacın olduğunu söyleyebilir misin?Görebildiğim kadarıyla herhangi bir ek kütüphane olmadan ulaşılabilir. Şimdilik tek cevap olarak kabul edeceğim, test etmek zor gibi görünüyor MockMVC –

+1

Neden çözümümün iyi olmadığını düşünüyorsun? HTTPComponents'lara ihtiyacınız yok, sadece onu kullandım çünkü sınıf yolunda zaten vardı. URL kodlu bir form öğesi oluşturabilen herhangi bir kütüphaneyi kullanabilirsiniz. Bu, urlencode ('name1') + '=' + urlencode (value1) + '&' + ... 'dır. Bunu yapmak için kendi yardımcı metodunuzu yazabilirsin –

+0

Bence bu işte mockMVC'de bir uygulama olsaydı daha iyi olurdu ve iyi olurdu, ama bu bir çözüm değil. Komik Bir süredir Java ile çalıştıktan sonra cevap verdiğimi görüyorum –

1

Sen ebil istemek d ayrıca oluşturduğum bu küçük kitaplığı kullan: https://github.com/f-lopes/spring-mvc-test-utils/. pom.xml'Bu

Ekleme bağımlılık:

<dependency> 
    <groupId>io.florianlopes</groupId> 
    <artifactId>spring-mvc-test-utils</artifactId> 
    <version>1.0.1</version> 
    <scope>test</scope> 
</dependency> 

MockMvc ile kullanın:

mockMvc.perform(MockMvcRequestBuilderUtils.postForm("/users", new AddUserForm("John", "Doe", null, new Address(1, "Street", 5222, "New York")))) 
    .andExpect(MockMvcResultMatchers.status().isFound()) 
    .andExpect(MockMvcResultMatchers.redirectedUrl("/users")) 
    .andExpect(MockMvcResultMatchers.flash().attribute("message", "success")); 

Bu kütüphane sadece form nesnesine göre, MockMvc isteğine parametreleri ekler.

İşte yazdığım detaylı öğretici geçerli: https://blog.florianlopes.io/tool-for-spring-mockmvcrequestbuilder-forms-tests/

+2

[Kişisel açık kaynak kitaplıkları nasıl sunuluyor?] (// meta.stackexchange.com/q/229085) konusunu okumak isteyebilirsiniz. –