web-dev-qa-db-fra.com

JUnit Assert avec BigDecimal

Je veux utiliser assert entre 2 deux décimales, j'utilise ceci:

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

mais le journal JUnit indique:

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

assertSame vérifie que les deux objets sont les mêmes objets, c.-à-d. qu'ils sont ==:

Affirme que deux objets font référence au même objet. S'ils ne sont pas identiques, une AssertionError sans message est lancée. 

Dans votre cas, puisque bd1 et bd2 sont tous deux nouveaux BigDecimal, les objets ne sont pas les mêmes, d’où l’exception.

Vous voulez utiliser assertEquals , qui teste si deux objets sont égaux, c'est-à-dire .equals:

Affirme que deux objets sont égaux. S'ils ne le sont pas, une AssertionError sans message est lancée. Si prévu et réel sont null, ils sont considérés comme égaux. 

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

La solution officielle junit pour affirmer que deux BigDecimal sont éga-.

Avec Java-hamcrest 2.0.0.0 , nous pouvons utiliser cette syntaxe:

    // 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 Référence rapide

45
frhack

assertSamechecks si les deux objets sont la même instance. assertEqualschecks Si les nombres sont égaux en valeur et en échelle, cela signifie que 1000 n'est pas égal à 1000,00. Si vous souhaitez comparer uniquement la valeur numérique, vous devez utiliser la méthode compareTo() de BigDecimal.

Par exemple: 

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

La comparaison de BigDecimal avec compareTo() fonctionne (en tant que: elle ignore la balance et compare le nombre réel), mais il est utile de connaître le nombre réel lors des tests unitaires, en particulier lorsque le test échoue.

Une option que j'ai utilisée dans ce cas est stripTrailingZeros() sur les deux BigDecimal:

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

Cette fonction supprime les zéros sans changer le nombre, donc "150" est converti en "1.5E+2": ainsi, peu importe si vous avez 150, 150.00 ou un autre formulaire dans otherBigDecimal car ils obtiennent normalisé dans le même formulaire.

La seule différence est qu'une null dans otherBigDecimal donnerait une NullPointerException au lieu d'une erreur d'assertion.

6
Daniele Segato

La méthode assertSame vérifie que les deux sont le même objet. Cependant, vous avez deux objets qui ont la même valeur. Pour tester cela, vous pouvez utiliser assertEquals.

Cependant, vous devez être conscient de certains comportements inattendus lorsque vous utilisez assertEquals (qui dépend de la méthode equals) sur BigDecimals. Par exemple, new BigDecimal("100").divide(new BigDecimal("10.0")).equals(new BigDecimal("10")) est évalué à false car equals examine également l'échelle des instances BigDecimal.

Dans de nombreuses circonstances, il est préférable de comparer BigDecimals en utilisant la méthode compareTo:

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

Autre alternative pour échelle spécifique et arrondie:

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 et bd2 sont deux différents objets, et puisque assertSame vérifie le référence de l'objet à l'aide de l'opérateur ==, vous obtenez ce message. Voir la documentation:

Affirme que deux objets se rapportent au même objet. S'ils ne sont pas identiques, une AssertionError sans message est lancée.

Utilisez plutôt assertEquals, car il vérifie que les deux objets sont égaux - ce que vous voulez.


Notez que la comparaison de deux objets BigDecimal à l'aide de l'opérateur == fonctionnera tant que leurs valeurs sont mises en cache (de 0 à 10). 

2
Maroun

Utilisez AssertEquals au lieu de AssertSame... raison parce que assertequals vérifie la valeur mais assertsame vérifie la référence ..

0
Vikrant Kashyap