Domanda

Sto tentando di scrivere alcuni casi di test per alcune classi che implicano il test dell'uguaglianza di matrici bidimensionali di dati. Ecco la mia prima pugnalata:

double[][] expected = {
        {0, 104, 0},
        {145.5, 0, 0},
        {83, 0, 0}
};

double[][] actual = someObject.getArray();

Ora, vedo che JUnit non ha un 'arrayEquals' per i doppi array, probabilmente a causa del problema in virgola mobile (vuoi davvero usare un delta contro l'uguaglianza). Ho notato che Junit-Addons ha esattamente il metodo che devo determinare se sono uguali:

static void  assertEquals(java.lang.String message, double[] expected, double[] actual, double delta) 

Ora, va tutto bene. Quello che voglio poter fare è dare un messaggio di errore significativo, non solo dicendo che i due sono disuguali ma dove sono disuguali. Esiste un modo semplice per farlo, a parte confrontare le dimensioni, quindi iterare su ogni elemento corrispondente e verificare l'uguaglianza? Sembra sciocco dover fare la stessa cosa che viene fatta nell'asserzione, solo per ottenere un messaggio di errore significativo.

È stato utile?

Soluzione

Penso che si stanno combinando test unitari con strumentazione / debugging. Lo scopo del test unitario è determinare se l'oggetto funziona come previsto. Se prendi l'abitudine di includere il codice che è (efficacemente) la strumentazione nei tuoi casi di test, aumenta la probabilità di scrivere casi di test progettati per passare.

Il tuo oggetto ha un metodo che è quello di restituire un double [] [] . Il tuo test case ti sta dicendo che non funziona come previsto. È ora di eseguire il debug del codice.

(Capisco che questo potrebbe essere un punto di vista controverso.)

Altri suggerimenti

Quindi, stai cercando di confrontare double [] so double [] [] s?

Se stai confrontando double [] s (array 1D), allora sì, che ne dici di usare Junit-Addons? il suo messaggio di errore predefinito non è quello di cui hai bisogno? Se invece sei in grado di scrivere i tuoi test per usare Double [], allora il metodo assertArraysEquals () di JUnit che opera su Object [] funzionerà. Tuttavia confronterà i doppi per l'uguaglianza esatta, supponendo che sia quello che intendi.

Se stai confrontando il doppio [] [], nessuno dei due funziona. Anche se double [] [] è un Object [], non hai intenzione di confrontare singoli double [] s poiché usano solo l'uguaglianza di riferimento.

Puoi usare commons-lang per fare il confronto, vero, anche se non ti aiuterà a generare un messaggio utile su dove sia la differenza. Per questo, penso che tu debba implementare il tuo metodo.

Ho capito bene, sei soddisfatto del metodo assertEquals (String, double [], double [], double) di JUnit-Addons ad eccezione dell'output?

Supponendo che tu abbia o possa ottenere l'origine della classe ArrayAssert, basta semplicemente reimplementare il metodo (copia e amp; incolla ma controlla prima la licenza) e migliora gli output nel nuovo metodo assertEquals personalizzato in base alle tue esigenze. Penso che non ci vorrà troppo!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top