JUnit Affirmer avec BigDecimal
Que je veux utiliser pour faire valoir entre les 2 deux virgule, j'utilise ceci:
BigDecimal bd1 = new BigDecimal (1000);
BigDecimal bd2 = new BigDecimal (1000);
org.junit.Assert.assertSame (bd1,bd2);
mais JUnit journal affiche:
expected <1000> was not: <1000>
- Ils ne sont pas sur le même objet que prévu. Vous pourriez être à la recherche pour vérifier si elles sont
equals
Remarque: BigDecimal ne pas envisager de1000.0
et1000.00
comme des égaux, comme le nombre de décimales sont différents. À mon humble avisdouble
est plus simple et plus enclins à faire des erreurs. 😉 - Je me demande quand seront fixes, je ne peux vraiment pas comment est-ce utile dans n'importe quel scénario.
- Pour la compatibilité ascendante, il ne sera jamais corrigé.
Vous devez vous connecter pour publier un commentaire.
assertSame
tests que les deux objets sont les mêmes objets, c'est à dire qu'ils sont==
:Dans ton cas, puisque
bd1
etbd2
sont à la fois nouveauxBigDecimal
, les objets ne sont pas les mêmes, donc l'exception.Ce que vous voulez est d'utiliser
assertEquals
, qui teste si deux objets sont égaux, c'est à dire.equals
:La officiel junit solution à affirmer que deux BigDecimal sont matematically l'égalité est d'utiliser hamcrest.
Avec java-hamcrest 2.0.0.0 nous pouvons utiliser cette syntaxe:
Hamcrest 1.3 Référence Rapide
java.lang.NoSuchMethodError: org.hamcrest.Matcher.describeMismatch(Ljava/lang/Object;Lorg/hamcrest/Description;)V
assertSame
vérifie si les deux objets sont de la même instance.assertEquals
vérifie si les nombres sont égaux en valeur et de l'échelle, qui veut dire 1000 n'est pas égal à 1000.00. Si vous voulez comparer seule la valeur numérique, vous devez utilisercompareTo()
méthode deBigDecimal
.Par exemple:
comparesEqualTo()
est préférable pour cette raison, dans les échecs,assertThat(x.compareTo(y), is(y)
donne quelque chose commeExpected: is <0> but: was <1>
.assertThat(x, comparesEqualTo(y)
donneExpected: a value equal to <27700> but: <6700.000> was less than <27700>
Comparant
BigDecimal
aveccompareTo()
œuvres (comme dans: il ignorer l'ampleur et de comparer le nombre), mais lorsque les tests unitaires, il est utile de savoir quel est le nombre réel, spécialement lorsque le test échoue.Une option que j'ai utilisé dans ce cas est
stripTrailingZeros()
sur les deuxBigDecimal
:Ce que cette fonction ne fait que supprimer les zéros sans changer de numéro, donc
"150"
est converti en"1.5E+2"
: de cette façon, il n'a pas d'importance si vous avez150
,150.00
ou autre forme dansotherBigDecimal
parce qu'ils obtiennent de normalisé dans le même formulaire.La seule différence est une
null
dansotherBigDecimal
donnerait unNullPointerException
au lieu d'une erreur d'assertion.La méthode
assertSame
tests que les deux sont le même objet. Cependant, vous avez deux objets qui ont la même valeur. Pour tester cela, vous pouvez utiliserassertEquals
.Cependant, vous devez être conscient de certains comportement inattendu lors de l'utilisation de
assertEquals
(qui dépend de laequals
méthode) surBigDecimal
s. Par exemple,new BigDecimal("100").divide(new BigDecimal("10.0")).equals(new BigDecimal("10"))
évalue àfalse
parce queequals
ressemble aussi à l'échelle de laBigDecimal
instances.Dans de nombreux cas, il est préférable de comparer
BigDecimal
s en utilisant lacompareTo
méthode:Autre alternative d'échelle spécifiques et arrondis:
bd1
etbd2
sont deux différents objets, et depuisassertSame
vérifie la référence d'objet à l'aide de la==
opérateur, vous obtenez ce message, consultez la documentation:Vous devez utiliser
assertEquals
au lieu de cela, il vérifie que les deux objets sont égaux - qui est ce que vous voulez.Noter que la comparaison de deux
BigDecimal
objets à l'aide de la==
opérateur de travailler aussi longtemps que leurs valeurs sont mises en cache (de 0 à 10) les valeurs.Utilisation
AssertEquals
au lieu deAssertSame
... parce que,assertequals
vérifie la valeur, maisassertsame
vérifie la refrence..