afirmar es igual a largo flotante int

¿Existe una manera elegante de afirmar que los números son iguales mientras se ignoran sus clases? Quiero usarlo en el marco de pruebas JUnit pero por ejemplo

Assert.assertEquals(1,1L)

falla con java.lang.AssertionError: esperado: java.lang.Integer <1> pero fue: java.lang.Long <1>

Espero que haya un buen método en algún lugar que compare solo el valor y funcione con int, long, float, byte, double, BigDecimal, BigInteger, lo que sea ...

Respuesta 1

Según mi lectura del JLS, la resolución de sobrecarga para

Assert.assertEquals(1,1L)

debe resolver a

Assert.assertEquals(long, long)

(Para el registro, assertEquals(long, long), assertEquals(float, float)y assertEquals(double, double)son aplicables por el estricto invocación , y el primero es el más específico, ver JLS 15.12.2.2 .. El contexto permite la invocación estricta ensanchamiento primitivo, pero no el boxeo o unboxing)

Si (como sugiere la evidencia) se está resolviendo su llamada Assert.assertEquals(Object, Object), eso implica que uno de los operandos ya debe ser un tipo en caja. El problema con esa sobrecarga es que está usando el equals(Object)método para comparar objetos, y el contrato para ese método especifica que el resultado es falsesi los tipos respectivos de los objetos son diferentes.

Si eso es lo que está sucediendo en su código real, entonces dudo que la sugerencia de usar el is(T) Matcherfuncione tampoco. El is(T)comparador es equivalente is(equalTo(T))y este último se basa en equals(Object)...

¿Existe un "buen método" existente?

AFAIK, no.

Creo que la solución real es estar un poco más atento a los tipos; p.ej

 int i = 1;
 Long l = 1L;
 Assert.assertEquals(i, l);         // Fails
 Assert.assertEquals((long) i, l);  // OK - assertEquals(Object, Object)
 Assert.assertEquals((Long) i, l);  // OK - assertEquals(Object, Object)
 Assert.assertEquals(i, (int) l);   // OK - assertEquals(long, long) 
                                    //      it would bind to an (int, int) 
                                    //      overload ... it it existed.   
 Assert.assertEquals(i, (long) l);  // OK - assertEquals(long, long)

Escribir una costumbre Matchertambién funcionaría.

Respuesta: 2

Envuelva esa funcionalidad en su propio Matcher y úsela con assertThat.

Matcher de muestra:

class IsAnyNumber extends BaseMatcher {
  final Object expected;
  //...
  public boolean matches(Object actual) {
    // compare / transform / check type / ensure: String, double, int, long
    // example via BigDecimal as seen from Mena (without checks)
    return new BigDecimal(expected).equals(new BigDecimal(actual));
  }
  // ...
}

// somewhere else:
public static IsAnyNumber is(Object expected) {
  return new IsAnyNumber(expected);
}

En sus pruebas, entonces llama a ese método estático:

assertThat(1, is(1L));
assertThat(1, is(1.0));
assertThat(1L, is(1));

De esta manera, puede reutilizar su coincidencia y la declaración de aserción es más legible al final.

Descargo de responsabilidad: esto es solo un seudocódigo y aún no se probó, pero debería funcionar con algunos ajustes.

Pero ten cuidado también de Comparar números en Java

Respuesta: 3

Cree sus propios métodos de afirmación y compare los valores dobles para las primitivas. Si BigDecimalse utiliza a, el valor primitivo debe convertirse aBigDecimal

static void assertEquals(Number number1, Number number2) {
  Assert.assertEquals(number1.doubleValue(), number2.doubleValue());
}

static void assertEquals(BigDecimal number1, BigDecimal number2) {
  if (number2.compareTo(number1) != 0) {
    Assert.fail("Values are not equal. ..... ");
  }
}

static void assertEquals(Number number1, BigDecimal number2) {
  assertEquals(new BigDecimal(number1.doubleValue()), number2);
}

static void assertEquals(BigDecimal number1, Number number2) {
  assertEquals(number2, number1);
}

Se puede usar de esta manera:

assertEquals(1, new BigDecimal("1.0"));
assertEquals(1.0d, 1);
assertEquals(new Float(1.0f), 1.0d);
assertEquals(new BigDecimal("1.00000"), new BigDecimal("1.0"));
...
Respuesta: 4

Tengo algunas pérdidas de memoria en mi aplicación. Todos se originan en torno a un clúster de vista específico en el que he pasado mucho tiempo retocando y tratando de reducir un paso contextual lo más posible. Esto lleva ...

Estoy usando Selenium WebDriver (ChromeDriver). Necesito eliminar algunos elementos de la página después del procesamiento (del modelo DOM). Por ejemplo, tengo un elemento siguiente: WebElement starRatingElement = ...

Estoy tratando de crear una biblioteca de medición de rendimiento personalizada, que un usuario puede usar para medir el rendimiento de cualquier método en una aplicación. Mi objetivo es lograr esto sin cambiar el ...

Tengo una carpeta llamada salida dentro de un cubo llamado BucketA. Tengo una lista de archivos en la carpeta de salida. ¿Cómo los descargo a mi máquina local con AWS Java SDK? A continuación se muestra mi código: AmazonS3Client ...