Come ottenere la 'differenza' tra le matrici in Java
-
07-07-2019 - |
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.
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!