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