Unit test di classi che hanno funzionalità online

23

Quando le funzioni di test unitario di una classe che ha funzioni private che richiedono funzionalità online. Come si può fare per testarlo?

Ad esempio:

public class Foo
{
    public int methodA()
    {
         int val = goOnlineToGetVal();

         return val;
    }

    private int goOnlineToGetVal()
    {
        CloudService c = new CloudService();
        int oval = c.getValueFromService();
        return oval;
    }
}

Se dovessi testare la funzione: 'metodoA ()' tenterebbe di utilizzare 'goOnlineToGetVal ()' che a sua volta cercherebbe di andare online, se questo test è stato eseguito senza funzionalità. Come potrei andare su una copertura di classe del 100% senza andare online?

    
posta Ben Crazed Up Euden 15.09.2014 - 22:05
fonte

2 risposte

76

new CloudService()

E c'è il tuo problema.

Il moderno design OO raccomanda che questo tipo di dipendenza sia passato in anziché costruito direttamente. Questo può essere passato alla funzione stessa o alla classe in fase di costruzione. Potrebbe anche essere afferrato o aggregato da un contenitore di Inversion of Control se tale tipo di complessità è giustificato.

A quel punto diventa abbastanza banale passare un servizio finto / falso per fornire i dati "online" durante i test. Meglio ancora, consente al tuo software di essere sufficientemente flessibile, in modo che tu possa adattarti rapidamente qualora un cliente (governativo?) Si presenti e non voglia utilizzare il cloud per i loro valori. O vuoi scaricare un provider cloud per un altro. Oppure ...

    
risposta data 15.09.2014 - 22:17
fonte
37

Lo implementerei in questo modo:

public class Foo
{
    private ICloudService cloudService;

    public Foo(ICloudService s)
    {
       cloudService=s;
    }

    public int methodA()
    {
         int val = goOnlineToGetVal();

         return val;
    }

    private int goOnlineToGetVal()
    {
        int oval = cloudService.getValueFromService();
        return oval;
    }
}

L'interfaccia ICloudService può essere implementata con una simulazione per il test o con il servizio cloud "reale". Quando l'istanziazione new CloudService() è obbligatoria per ogni chiamata di getValueFromService , o CloudService è da un'API di terze parti che non può essere modificata, implementa un wrapper, derivante da ICloudService e effettua le chiamate appropriate.

    
risposta data 15.09.2014 - 22:42
fonte

Leggi altre domande sui tag