it-swarm.com.de

JUnit Assert mit BigDecimal

Ich möchte Assert zwischen 2 und 2 Dezimalstellen verwenden.

BigDecimal bd1 = new BigDecimal (1000);
BigDecimal bd2 = new BigDecimal (1000);
org.junit.Assert.assertSame (bd1,bd2);

aber das JUnit-Protokoll zeigt:

expected <1000> was not: <1000>
30
kAnGeL

assertSame testet, dass die beiden Objekte dieselben Objekte sind, d. h. dass sie == sind:

Gibt an, dass zwei Objekte auf dasselbe Objekt verweisen. Wenn sie nicht gleich sind, wird eine AssertionError ohne Nachricht ausgegeben. 

Da in Ihrem Fall bd1 und bd2 beide neu BigDecimal sind, sind die Objekte nicht gleich, daher die Ausnahme.

Sie möchten assertEquals verwenden, um zu testen, ob zwei Objekte gleich sind, d. H. .equals:

Stellt fest, dass zwei Objekte gleich sind. Wenn dies nicht der Fall ist, wird eine AssertionError ohne Nachricht ausgegeben. Wenn erwartet und aktuell null sind, werden sie als gleich betrachtet. 

BigDecimal bd1 = new BigDecimal (1000);
BigDecimal bd2 = new BigDecimal (1000);
org.junit.Assert.assertEquals(bd1,bd2);
5
Tunaki

Die offizielle Junit-Lösung , die behauptet, dass zwei BigDecimal matematisch gleich sind, ist die Verwendung von hamcrest.

Mit Java-hamcrest 2.0.0.0 können wir diese Syntax verwenden:

    // import static org.hamcrest.MatcherAssert.assertThat;
    // import org.hamcrest.Matchers;

    BigDecimal a = new BigDecimal("100")
    BigDecimal b = new BigDecimal("100.00")
    assertThat(a,  Matchers.comparesEqualTo(b));

Hamcrest 1.3 Kurzreferenz

45
frhack

assertSame prüft, ob beide Objekte dieselbe Instanz sind. assertEquals prüft, ob die Zahlen in Wert und Skalierung gleich sind, das heißt, 1000 ist nicht gleich 1000,00. Wenn Sie nur den numerischen Wert vergleichen möchten, sollten Sie die compareTo()-Methode von BigDecimal verwenden.

Zum Beispiel: 

BigDecimal bd1 = new BigDecimal (1000.00);
BigDecimal bd2 = new BigDecimal (1000);
org.junit.Assert.assertTrue(bd1.compareTo(bd2) == 0); 
20
Endery

Der Vergleich von BigDecimal mit compareTo() funktioniert (wie in: es ignoriert die Waage und vergleicht die tatsächliche Zahl), aber beim Komponententest ist es hilfreich zu wissen, welche Zahl gerade ist, insbesondere wenn der Test fehlschlägt.

Eine Option, die ich in diesem Fall verwendet habe, ist stripTrailingZeros() für beide BigDecimal:

assertEquals(new BigDecimal("150").stripTrailingZeros(),
                    otherBigDecimal.stripTrailingZeros());

Diese Funktion entfernt Nullen, ohne die Zahl zu ändern. Daher wird "150" in "1.5E+2" konvertiert: Auf diese Weise ist es unerheblich, ob Sie 150, 150.00 oder eine andere Form in otherBigDecimal haben, da sie normalized in dieselbe Form bringen.

Der einzige Unterschied ist, dass eine null in otherBigDecimal eine NullPointerException anstelle eines Assertionsfehlers gibt.

6
Daniele Segato

Die Methode assertSame testet, dass beide dasselbe Objekt sind. Sie haben jedoch zwei Objekte, die denselben Wert haben. Um dies zu testen, können Sie assertEquals verwenden.

Bei der Verwendung von assertEquals (abhängig von der equals-Methode) für BigDecimals sollten Sie sich jedoch eines unerwarteten Verhaltens bewusst sein. Zum Beispiel wird new BigDecimal("100").divide(new BigDecimal("10.0")).equals(new BigDecimal("10")) zu false ausgewertet, da equals auch den Maßstab der BigDecimal-Instanzen betrachtet.

In vielen Fällen ist es besser, BigDecimals mithilfe der compareTo-Methode zu vergleichen:

assertTrue(bd1.compareTo(bd2) == 0);
5
Hoopje

Andere Alternative für bestimmte Skala und gerundet:

import static org.assertj.core.api.Assertions.assertThat;

...

BigDecimal a = new BigDecimal(100.05);
BigDecimal b = new BigDecimal(100.048);

a = a.setScale(2, BigDecimal.ROUND_HALF_EVEN);
b = b.setScale(2, BigDecimal.ROUND_HALF_EVEN);

assertThat(a).isEqualTo(b);
2
alditis

bd1 und bd2 sind zwei verschiedene Objekte. Da assertSame die Objektreferenz mit dem ==-Operator überprüft, erhalten Sie diese Meldung.

Gibt an, dass zwei Objekte auf dasselbe Objekt verweisen. Wenn sie nicht gleich sind, wird eine AssertionError ohne Nachricht ausgegeben.

Sie sollten stattdessen assertEquals verwenden. Dabei wird geprüft, ob die beiden Objekte gleich sind - was Sie möchten.


Beachten Sie, dass der Vergleich zweier BigDecimal-Objekte mit dem ==-Operator funktioniert, solange ihre Werte zwischen 0 und 10 zwischengespeichert werden. 

2
Maroun

Verwenden Sie AssertEquals anstelle von AssertSame... reason, weil assertequals den Wert überprüft, assertsame die Aktualität.

0
Vikrant Kashyap