Возвращаемое значение для смоделированного метода равно нулю в Spring Boot @WebMvcTest - PullRequest
0 голосов
/ 03 апреля 2019

Следующий тест не пройден с: org.json.JSONException: Unparsable JSON string.Я пробовал различные варианты насмешек по методу saveAndFlush

//      doAnswer(returnsFirstArg()).when(this.shipwreckRepository).saveAndFlush(shipwreck);

//      when(this.shipwreckRepository.saveAndFlush(shipwreck))
//          .then(returnsFirstArg());

, однако появляется та же ошибка, и MockHttpServletResponse тело равно нулю

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = {}
     Content type = null
             Body = 

Как смоделировать хранилище saveAndFlushметод возвращает значение правильно?

SpringBootHomeControllerTest.java

@RunWith(SpringRunner.class)
@WebMvcTest(ShipwreckController.class)
public class SpringBootShipwreckControllerTests {

@Autowired 
private MockMvc mvc;

@MockBean
private ShipwreckRepository shipwreckRepository;


@Test
public void createShipwreck() throws Exception {
    Shipwreck shipwreck = generateSampleShipwreck();

    when(shipwreckRepository.saveAndFlush(shipwreck)).then(i -> i.getArgumentAt(0, Shipwreck.class));

    ObjectMapper mapper = new ObjectMapper();       
    String shipwreckJson = mapper.writeValueAsString(shipwreck);
    this.mvc.perform(post("/api/v1/shipwrecks")
                    .contentType(MediaType.APPLICATION_JSON)
                    .content(shipwreckJson)
                     )

            .andExpect(status().isOk())
            .andExpect(content().json(shipwreckJson));
    verify(this.shipwreckRepository).saveAndFlush(shipwreck);


}

private Shipwreck generateSampleShipwreck() {
    Integer depth = 10;
    Double latitude = 1.0;
    Double longitude = 1.0;
    Integer yearDiscovered = 1;
    String name = "name";
    String description = "desc";
    String condition = "cond";
    Shipwreck shipwreck = new Shipwreck(1L, name, description, condition, depth, latitude, longitude, yearDiscovered);
    return shipwreck;
}

}

ShipwreckRepository.java

public interface ShipwreckRepository extends JpaRepository<Shipwreck, Long> {

}

ShipwreckController.java

@RestController
@RequestMapping("/api/v1/")
public class ShipwreckController {

    @Autowired
    private ShipwreckRepository shipwreckRepository;

    @RequestMapping(value = "shipwrecks", method = RequestMethod.POST)
    public Shipwreck create(@RequestBody Shipwreck shipwreck) {
        return shipwreckRepository.saveAndFlush(shipwreck);
    }
}

Shipwreck.java

package com.boot.model;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class Shipwreck {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    Long id;
    String name;
    String description;
    String condition;
    Integer depth;
    Double latitude;
    Double longitude;
    Integer yearDiscovered;

    public Shipwreck() { }

    public Shipwreck(Long id, String name, String description, String condition, Integer depth, Double latitude, Double longitude, Integer yearDiscovered) {
        this.id = id;
        this.name = name;
        this.description = description;
        this.condition = condition;
        this.depth = depth;
        this.latitude = latitude;
        this.longitude = longitude;
        this.yearDiscovered = yearDiscovered;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public String getCondition() {
        return condition;
    }

    public void setCondition(String condition) {
        this.condition = condition;
    }

    public Integer getDepth() {
        return depth;
    }

    public void setDepth(Integer depth) {
        this.depth = depth;
    }

    public Double getLatitude() {
        return latitude;
    }

    public void setLatitude(Double latitude) {
        this.latitude = latitude;
    }

    public Double getLongitude() {
        return longitude;
    }

    public void setLongitude(Double longitude) {
        this.longitude = longitude;
    }

    public Integer getYearDiscovered() {
        return yearDiscovered;
    }

    public void setYearDiscovered(Integer yearDiscovered) {
        this.yearDiscovered = yearDiscovered;
    }
}

1 Ответ

1 голос
/ 03 апреля 2019

Используйте Mockito.any () вместо конкретного экземпляра Shipwreck в ваших инструкциях when () и verify ().

Экземпляр Shipwreck, который будет получен вашим протестированным контроллером, не будет экземпляромвы создали, но новый, созданный из десериализации json, которым вы его называете.Следовательно, Mockito не будет отвечать на инструкции, в которых указано использовать предыдущий экземпляр.

Альтернатива: определить соответствующие методы equals () и hashCode () для Shipwreck.

...