2015-12-26 6 views
1

Я работаю с:Spring Test MVC с Hamcrest: Как размер испытания и значение для Generic Collection

  • Spring MVC
  • Spring Rest
  • Spring MVC Тест

его генерируют данные в:

  • XML
  • JSON
  • HTML

У меня есть этот класс:

@XmlRootElement(name="generic-collection") 
public class GenericCollection<T> { 

    private Collection<T> collection; 

    public GenericCollection(){ 

    } 

    public GenericCollection(Collection<T> collection){ 
     this.collection = collection; 
    } 

    @XmlElement(name="item") 
    public Collection<T> getCollection() { 
     return collection; 
    } 

    public void setCollection(Collection<T> collection) { 
     this.collection = collection; 
    } 

    @Override 
    public String toString() { 
     StringBuilder builder = new StringBuilder(); 
     for(Object object : collection){ 
     builder.append("["); 
     builder.append(object.toString()); 
     builder.append("]"); 
     } 
     return builder.toString(); 
    } 

} 

Мне нужен этот класс обертки для XML. Его можно использовать в покое для JSON.

@Controller имеет (наблюдать, как создается коллекция):

@RequestMapping(method=RequestMethod.GET, produces={MediaType.APPLICATION_XML_VALUE, MediaType.APPLICATION_JSON_UTF8_VALUE}) 
public class PersonaFindAllController { 

    private GenericCollection<Persona> personas; 

    public PersonaFindAllController(){ 
     personas = new GenericCollection<>(PersonaFactory.crearPersonas());   
    } 

@RequestMapping для XML/JSON является

@RequestMapping(value={PersonaFindAllURLSupport.FINDALL}) 
public @ResponseBody GenericCollection<Persona> findAll(){ 
    return personas; 
} 

Рассмотрим выше Rest, поскольку он использует @ResponseBody

Через Spring MVC Test и Hamcrest

я могу проверить содержимое для XML и JSON следующим образом соответственно:

resultActions.andExpect(xpath("generic-collection").exists()) 
      .andExpect(xpath("generic-collection").nodeCount(is(1))) 

      .andExpect(xpath("generic-collection/item").exists()) 
      .andExpect(xpath("generic-collection/item").nodeCount(is(5))) 

      .andExpect(xpath("generic-collection/item[1]").exists()) 
      .andExpect(xpath("generic-collection/item[1]/*").nodeCount(is(4))) 
      .andExpect(xpath("generic-collection/item[1]/id").exists()) 
      .andExpect(xpath("generic-collection/item[1]/id").string(is("88"))) 
…. 

и

resultActions.andExpect(jsonPath('collection').exists()) 
      .andExpect(jsonPath('collection').isArray()) 

      .andExpect(jsonPath('collection',hasSize(is(5)))) 

      .andExpect(jsonPath('collection[0]').exists()) 
      .andExpect(jsonPath('collection[0].*', hasSize(is(4)))) 
      .andExpect(jsonPath('collection[0].id').exists()) 
      .andExpect(jsonPath('collection[0].id').value(is("88"))) 
….  

Моя проблема с Spring MVC. В же@Controller ниже другого @RequestMapping метода:

@RequestMapping(value={PersonaFindAllURLSupport.FINDALL},  produces=MediaType.TEXT_HTML_VALUE) 
public String findAll(Model model){ 
    model.addAttribute(personas); 
    return "some view"; 
} 

возвращает имя вида и использовать модель. Это, как это принято в Spring MVC

Благодаря Spring MVC тест print() метод, который я могу подтвердить следующие действия:

ModelAndView: 
     View name = persona/findAll 
      View = null 
     Attribute = genericCollection 
      value = [Persona [id=88, nombre=Manuel, apellido=Jordan, fecha=Mon Jul 06 00:00:00 PET 1981]][Persona [id=87, nombre=Leonardo, apellido=Jordan, fecha=Sun Jul 05 00:00:00 PET 1981]]...] 
      errors = [] 

Смотрите внимательно:

  • Расширенные данные value
  • помню GenericCollection<T> ' s toString() способ.

Для тестирования у меня есть:

resultActions.andExpect(model().attribute("genericCollection", notNullValue())) 

Пока не работает. Поэтому возвращены некоторые данные, а не null.

Как я могу проверить размер и данные?

Я попытался по размеру:

.andExpect(model().attribute("genericCollection", hasSize(5))) 

И я получаю

java.lang.AssertionError: Model attribute 'genericCollection' 
Expected: a collection with size <5> 
    but: was <[Persona [id=88, nombre=Manuel, apellido=Jordan, fecha=Mon Jul 06 00:00:00 PET 1981]….] 

Если я использую

.andExpect(model().attribute("genericCollection", hasItem("collection"))) 

Я всегда

java.lang.AssertionError: Model attribute 'genericCollection' 
Expected: a collection containing "collection" 
    but: was <[Persona [id=88, nombre=Manuel, apellido=Jordan, fecha=Mon Jul 06 00:00:00 PET 1981]] 

Итак, что такое правильный синтаксис.

ответ

3

Поскольку вы пытаетесь написать утверждение для коллекции, которая обернута внутри класса GenericConnection, вам нужно сначала получить ссылку на фактическую коллекцию, прежде чем вы сможете написать для нее утверждение. Это должно делать трюк:

.andExpect(model().attribute("genericCollection", 
     hasProperty("collection", hasSize(5)) 
)) 

Чтобы проверить содержание следующим образом:

.andExpect(model().attribute("genericCollection", 
         hasProperty("collection", 
          hasItem(
           allOf(
            hasProperty("id", is("100")), 
            hasProperty("nombre", is("Jesús")), 
            hasProperty("apellido", is("Mão")) 

           ) 
          ) 
          ) 
         ) 
        ) 

 Смежные вопросы

  • Нет связанных вопросов^_^