如何使用 Gson 解析验证我的 Junit 测试

Posted

技术标签:

【中文标题】如何使用 Gson 解析验证我的 Junit 测试【英文标题】:How I can to validate my Junit test with Gson parse 【发布时间】:2021-12-24 21:16:48 【问题描述】:

我正在使用 Gson 库和 jakarta。虽然我已经能够使用 CarrinhoResource.java 中的转换,如下所示,但我的 ClienteTest.java 无法使用购物车内的字符串内容(已经在 json 中)。我无法在我的 intellij 中运行我的测试,只有一条消息是(无法解析方法'fromJson(java.lang.String)')。 有人可以帮我吗?

Class CarrinhoResource.java
package br.com.alura.loja.resource;

import br.com.alura.loja.dao.CarrinhoDAO;
import br.com.alura.loja.modelo.Carrinho;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.Produces;
import jakarta.ws.rs.core.MediaType;


@Path("/v1/carrinhos")
public class CarrinhoResource 

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public String busca()
      Carrinho carrinho = new CarrinhoDAO().busca(1L);
    return carrinho.toJson();
    



Carrinho.java
package br.com.alura.loja.modelo;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import com.google.gson.Gson;


public class Carrinho 

    private List<Produto> produtos = new ArrayList<Produto>();
    private String rua;
    private String cidade;
    private long id;

    public Carrinho adiciona(Produto produto) 
        produtos.add(produto);
        return this;
    

    public Carrinho para(String rua, String cidade) 
        this.rua = rua;
        this.cidade = cidade;
        return this;
    

    public Carrinho setId(long id) 
        this.id = id;
        return this;
    

    public String getRua() 
        return rua;
    

    public void setRua(String rua) 
        this.rua = rua;
    
    public void setCidade(String cidade) 
        this.cidade = cidade;
    
    
    public long getId() 
        return id;
    
    
    public void remove(long id) 
        for (Iterator iterator = produtos.iterator(); iterator.hasNext();) 
            Produto produto = (Produto) iterator.next();
            if(produto.getId() == id) 
                iterator.remove();
            
        
    
    
    public void troca(Produto produto) 
        remove(produto.getId());
        adiciona(produto);
    

    public void trocaQuantidade(Produto produto) 
        for (Iterator iterator = produtos.iterator(); iterator.hasNext();) 
            Produto p = (Produto) iterator.next();
            if(p.getId() == produto.getId()) 
                p.setQuantidade(produto.getQuantidade());
                return;
            
        
    
    
    public List<Produto> getProdutos() 
        return produtos;
    

    public String toJson() 
        return new Gson().toJson(this);
    



ClienteTest.java

package br.com.alura.loja;

import br.com.alura.loja.modelo.Carrinho;
import com.google.gson.*;
import jakarta.ws.rs.client.Client;
import jakarta.ws.rs.client.ClientBuilder;
import jakarta.ws.rs.client.WebTarget;
import org.junit.Assert;
import org.junit.Test;

public class ClienteTest 

    @Test
    public void testaConexaoServidor() 

        Client client = ClientBuilder.newClient();
        WebTarget target = client.target("http://localhost:8085");
        String conteudo = target.path("/v1/carrinhos").request().get(String.class);

        Carrinho carrinho = (Carrinho) new Gson().fromJson(conteudo); **//Cannot resolve method 'fromJson(java.lang.String)'/**
        System.out.println(carrinho);
        Assert.assertEquals("Rua Vergueiro, 3185", carrinho.getRua());


    

【问题讨论】:

【参考方案1】:
Carrinho carrinho = (Carrinho) new Gson().fromJson(conteudo); **//Cannot resolve method 'fromJson(java.lang.String)'/**

原因是没有Gson.fromJson(String)方法,见Gson class documentation。对于反序列化,Gson 需要知道您期望的类型,因此所有fromJson 方法都有一个表示类型的第二个参数。

您只需将代码更改为:

Carrinho carrinho = new Gson().fromJson(conteudo, Carrinho.class);

【讨论】:

以上是关于如何使用 Gson 解析验证我的 Junit 测试的主要内容,如果未能解决你的问题,请参考以下文章

竹失败测试无法解析junit

基于junit的单元测试类编写

如何使用 Gson 解析 JSON 数组

如何在 JUnit 测试中使用 Spring defaultValidator

如何在android中使用GSON解析json解析

如何使 JUnit 测试用例按顺序运行?