samedi 7 novembre 2020

How to mock chained methods?

Having issues mocking a chained method with Spock. So from the line below

objectMapper.readerFor(new TypeReference<List<Article>>(){}).readValue(articlesJson);

objectMapper.readerFor(...) returns a ObjectReader which is always null.

I have tried splitting it up in previous attempts and still returns null As in

objectMapper.readerFor(new TypeReference<List<Article>>(){}) >> objectReader
objectReader.readValue(_) >> [createArticle()]

LoadInventory.java

@Slf4j
@Component
public class LoadInventory {

  @Autowired
  ArticleRepository articleRepository;

  @Autowired
  ObjectMapper objectMapper;

  @Value("classpath:inventory.json")
  Resource articleResource;

  public void loadInventory(){
    try {
      JsonNode articlesJson = objectMapper.readTree(articleResource.getInputStream()).get("inventory");
      List<Article> articleList = objectMapper.readerFor(new TypeReference<List<Article>>(){}).readValue(articlesJson);
      articleRepository.saveAll(articleList);
    } catch (IOException e) {
      log.error("Unable to load inventory file.");
    }
  }
}

LoadInventorySpec.groovy

class LoadInventorySpec extends Specification {
  @Subject
  LoadInventory loadInventory

  @Collaborator
  ArticleRepository articleRepository = Mock()

  @Collaborator
  ObjectMapper objectMapper = Mock()

  @Collaborator
  Resource resource = Mock()

  def "Load inventory"(){
    when:
    loadInventory.loadInventory()

    then:
    objectMapper.readTree(_) >> createInventoryNode()
    objectMapper.readerFor(new TypeReference<List<Article>>(){}).readValue(_) >> [createArticle()]
  }

  JsonNode createInventoryNode() {
    ObjectMapper testObjectMapper = new ObjectMapper()
    String inventoryString = "{\"inventory\": [ { \"art_id\": \"1\", \"name\": \"leg\", \"stock\": \"12\"}]}"
    testObjectMapper.readTree(inventoryString)
  }

  Article createArticle() {
    new Article(1, "leg", 12)
  }
}

Aucun commentaire:

Enregistrer un commentaire