Spring - rest API - Come testare un'API di riposo che recupera i dati da un altro servizio

1

Sono nuovo per le API e per i mock. Per favore aiutami ..

Ho una serie di API di riposo per le quali ho bisogno di scrivere test unitari. a sua volta l'API a sua volta chiama un altro servizio, riceve la risposta JSON e restituisce la risposta [dati]. Fondamentalmente sta interrogando un elenco di dati anagrafici come utenti, fornitori, paesi ecc.

La mia domanda è: come posso testare questa unità? Qualunque codice di esempio potrebbe aiutarmi ad iniziare?

)

pacchetto mds; / * tutte le importazioni rimosse qui * /

Tieni presente quanto segue, questa url si riferisce al servizio esterno che restituisce i dati alla mia API di riposo sotto test

** // servizio esterno uri dal valore di esempio del file delle proprietà nel file delle proprietà

// link ?

String archesURL = null;** 

@Value ( "$ {} mds.arches.address"

@RestController

@RequestMapping ( "/ api")

classe pubblica MasterdataSearchService {

private static final long serialVersionUID = 1L;
private static final String USER_AGENT = "Mozilla/5.0";
private final String[] excludeFields = { "ir_classname", "arches_type" };
public static final String KeyRealm = "realm";

public static final String MDSAdapterId = "app.masterdataservice";
public static final String irClassName = "ir_classname";
public static final String masterdataClassParameter = "System.Base.MasterdataClassList.Register";

static Hashtable<String, String> pathToClassNameMap = new Hashtable<String, String>();

//external service uri from properties file

@Value("${mds.arches.address}")

String archesURL = null;

@Value("#{${mds.ir_class.path}}")
private Map<String, String> irClassNames;

static String searchOptions = "arches.preview=false&sort=score desc,DefaultRelevance desc&wt=json";
static ClientHttpRequestFactory requestFactory;

@Autowired
private ResourceLoader resourceLoader;

@RequestMapping(value = "data/{classObject}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
public @ResponseBody String getListOfClassObject (@PathVariable("classObject") String classObject,
                                                  @RequestParam(value = "fields",required=false) List<String> fields,
                                                  @RequestParam(value = "uniquename",required=false) String uniqueName,
                                                  @RequestParam(value = "name",required=false) String name,
                                                  @RequestParam(value = "rows",required=false) int rows) throws JSONException, Exception
{

    //hardcoded for better understanding
    String anId = "71000003015" ;  
    String client= "ups" ;      

    searchTerms.add(new SearchTerm("ir_classname", irClassNames.get(classObject)));

    if (!StringUtils.isEmpty(name)) {

        if (classObject.equals("commoditycodes")) {
            searchTerms.add(new SearchTerm("HierarchyPath", name));
        }
        else {
            searchTerms.add(new SearchTerm("Name", name));
        }
    }

    if (!StringUtils.isEmpty(uniqueName)) {
        searchTerms.add(new SearchTerm("UniqueName", uniqueName));
    }

    StringBuilder sb = new StringBuilder();


    sb.append(
        archesURL + searchOptions + "&adapter=" + MDSAdapterId + "&tenant=" + anId + "." + client + "&q=" + "(");

    for (SearchTerm st : searchTerms) {
        sb.append(st.toString());
    }
    sb.append(")");

    if (rows > 0) {
        sb.append("&rows=" + rows);
    }

    // Get only the fields specified by "field" query parameter
    // else get every fields for the object
    sb.append(getReturnFields(fields));

    JSONArray arr = getJSONArrayFromResponse(sendGet(sb.toString()));

    return arr.toString();

}
    
posta Sajeev 29.05.2016 - 18:39
fonte

1 risposta

1

Il modo standard consiste nel creare una simulazione della classe / metodo che chiama il servizio esterno. Questo simulato verifica che la richiesta (URL) sia corretta e restituisce una risposta - nota che non chiama il servizio esterno.

Puoi farlo incapsulando questo sendGet () nella propria classe di servizio con l'interfaccia. Nel codice di test, si istanzia e si inietta l'implementazione fittizia di questa interfaccia nella classe controller anziché in quella reale dell'implementazione (utilizzata nella produzione).

Se desideri un test di integrazione invece del test unitario, puoi usare qualcosa come WireMock per creare un server fittizio che gestisce il servizio esterno. Questo è più lavoro, ma può rilevare più problemi con la tua implementazione.

    
risposta data 29.05.2016 - 19:43
fonte

Leggi altre domande sui tag