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>
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 sontnull
, ils sont considérés comme égaux.
BigDecimal bd1 = new BigDecimal (1000);
BigDecimal bd2 = new BigDecimal (1000);
org.junit.Assert.assertEquals(bd1,bd2);
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));
assertSame
checks si les deux objets sont la même instance. assertEquals
checks 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);
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.
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 BigDecimal
s. 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 BigDecimal
s en utilisant la méthode compareTo
:
assertTrue(bd1.compareTo(bd2) == 0);
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);
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).
Utilisez AssertEquals
au lieu de AssertSame
... raison parce que assertequals
vérifie la valeur mais assertsame
vérifie la référence ..