Entiendo que Junit5 Assertions.assertThrows
acepta un objeto de tipo ejecutable. Así que para un simple ejemplo en el que un constructor no podrá tomar una cadena vacía como un parámetro de nombre:
public Company(String aName, Calendar aFoundingDate)
{
if (aName == null || aName.length() == 0 || aName.length() > 50) {
throw new IllegalArgumentException("Invalid name");
}
this.name = aName;
foundingDate = aFoundingDate;
}
Puedo escribir una prueba como esta:
// Company constructor test
@Test
void testCompanyConstructor() {
// Given
String emptyName = "aabbe";
Calendar validFoundingDate = Calendar.getInstance();
validFoundingDate.set(2000, 1, 1);
// Then
assertThrows(IllegalArgumentException.class, () -> new Company(emptyName, validFoundingDate));
}
Lo que me pregunto es, ¿qué ocurre con el ejecutable, es decir, la expresión lambda? ¿El JUnit llamar ejecutar () en la expresión Lambda y, al hacerlo, se crea el objeto anónimo empresa con el nombre vacío y la excepción es
Apéndice: Estas versiones son equivalentes:
// Company constructor test
@Test
void testCompanyConstructor() {
// Given
String emptyName = "";
Calendar validFoundingDate = Calendar.getInstance();
validFoundingDate.set(2000, 1, 1);
// Then
Executable executable = new Executable() {
public void execute() {
new Company(emptyName, validFoundingDate);
}
};
assertThrows(IllegalArgumentException.class, executable);
assertThrows(IllegalArgumentException.class, () -> new Company(emptyName, validFoundingDate));
}
Al inspeccionar el código de assertThrows
podemos ver que no hay tales profundamente código colocado en AssertThrows::assertThrows
:
try {
executable.execute();
}
catch (Throwable actualException)
if (expectedType.isInstance(actualException)) {
return (T) actualException;
}
else {
BlacklistedExceptions.rethrowIfBlacklisted(actualException);
String message = buildPrefix(nullSafeGet(messageOrSupplier))
+ format(expectedType, actualException.getClass(), "Unexpected exception type thrown");
throw new AssertionFailedError(message, actualException);
}
}
por lo que, básicamente, invoca Executable
y las capturas Throwable
que podrían ser lanzados y lo devuelve. Si no es una excepción fue arrojado o el tipo de excepción es diferente de lo esperado - la afirmación falla.