Releases: assertj/assertj
v3.27.2
v3.27.1
🚫 Deprecated
Core
- Deprecate
usingComparatorForFields
and remove deprecated assertions fromusingComparatorForType
documentation #3711 - Deprecate
hasCauseReference(Throwable)
fromThrowable
assertions #3715
🐛 Bug Fixes
Core
- Fix missing introspection for record accessors #3710
- Honor assertion description in
asString()
- Avoid
InputStream
manipulation whenmark
/reset
are supported #3713 - NPE with custom
RecursiveComparisonConfiguration
onusingRecursiveFieldByFieldElementComparator
#3719
⚡ Improvements
- Declare license using SPDX identifier #3718
❤️ Contributors
Thanks to all the contributors who worked on this release:
v3.27.0
🚫 Deprecated
Core
- Deprecate
ClassBasedNavigableIterableAssert
andClassBasedNavigableListAssert
#3529
✨ New Features
Core
- Add
actual()
to access the object under test #3489 - Add
isCompletedWithValueMatchingWithin
toCompletableFuture
assertions #3506 - Add
completesExceptionallyWithin
toCompletableFuture
assertions #3597 - Add
inBinary
toCharSequence
assertions #3600 - Support for
Assertions.byLessThan(Duration)
andAssertions.within(Duration)
#3486 - Add standard representation for
CharSequence
#3617 - Add predicate descriptions overloads to
anyMatch
andnoneMatch
#3639 - Add
doesNotMatch(Predicate)
#3684 - Add
usingEquals
accepting aBiPredicate
and an optional description to provide a custom comparison in assertions #3678
Guava
- Add
isNotEmpty
toTable
assertions #3559
🐛 Bug Fixes
Core
- Recursive assertion
hasNoNullFields
throws NPE with fields of anonymous and local types #3534 - Fix incorrect mutation of
actualElementsGroupedByHashCode
in recursive comparison - Recursive comparison
ignoringFields
not working properly with maps #2988 - Custom representation ignored when describing expected items not in the actual list #3646
hasFieldOrPropertyWithValue
swallows exceptions thrown by getters, and reports non-existent property instead #3563satisfies()
with nested assertions obscures stack trace #2542- Recursive comparison fails if ignored fields are not found in
expected
#3226
⚡ Improvements
Core
- Report all failing conditions when using
satisfies(allOf(Condition...))
#3537 - Fix Unicode escapes in
inUnicode()
Javadoc - Show error differences if values were compared with
equals
in recursive comparison #3209 - Propagate common basetype for
extracting(Function...)
#3673 - Add throwable stacktrace to
ShouldNotContainCharSequence
- Remove unused code and other minor cleanup #3683
- Simplify comparison strategy
isLessThan
andisLessThanOrEqualTo
inAbstractComparisonStrategy
#3694 - Update
AbstractCharSequenceAssert.java
reference #3700 - Include stack trace of internal errors in all/any satisfy assertions
🔨 Dependency Upgrades
Core
Guava
- Upgrade to Guava 33.4.0-jre #3705
❤️ Contributors
Thanks to all the contributors who worked on this release:
@JunHyungJang @mipo256 @vladykin @Marcono1234 @sunaleed @etrandafir93 @FlorianCousin @OlivierCavadenti @jh-instant @patrickuhlmann @IvoHD @alexandra-junghans @fmbenhassine @etrandafir93 @shaikhu @cookieMr @emmanuel-ferdman @mk868
v3.26.3
🧩 Binary Compatibility
The release is:
- Binary compatible with the previous minor version.
- Binary incompatible with the previous patch version.
💥 Breaking Changes
Core
- Replace
assertThat(Temporal)
withassertThatTemporal(Temporal)
#3519
🐛 Bug Fixes
Core
- Fix Javadoc rendering on
FactoryBasedNavigableListAssert::assertThat
- Allow
ComparingNormalizedFields
instances to be reused across different assertions #3493
🔨 Dependency Upgrades
Core
Guava
- Upgrade to Guava 33.2.1-jre #3499
❤️ Contributors
Thanks to all the contributors who worked on this release:
v3.26.0
💥 Breaking Changes
Core
-
Delegate
OptionalDouble
value comparison toDouble.compare
inhasValue
assertion #3411Details
This fixes the comparison of
NaN
values which wasn't working the way thehasValue
Javadoc describes.The previous behavior can be obtained with
getAsDouble
:assertThat(OptionalDouble.of(Double.NaN).getAsDouble()).isSameAs(Double.NaN);
🚫 Deprecated
Core
- Deprecate
ObjectAssertFactory
in favor ofAssertions.assertThat(Object)
- Deprecate
AssertionErrorFactory
in favor ofAssertionErrorCreator
- Deprecate
catchThrowableOfType(ThrowingCallable, Class)
in favor ofcatchThrowableOfType(Class, ThrowingCallable)
#2823 - Deprecate
assertThat(Iterable, AssertFactory)
,assertThat(Iterable, Class)
and their respectivethen
variants #3453
✨ New Features
Core
- Support multiple
AfterAssertionErrorCollected
callbacks #3313 - Add
InstanceOfAssertFactory
forSet
instances #3325 - Add
doesNotContainKey
anddoesNotContainKeys
to GuavaMultimap
assertions #3334 - Add assertions for JDK
YearMonth
type #3142 - Add
TemporalAssert
type #3404 - Add
ignoringFieldsOfTypesMatchingRegexes
#3369 - Add
fail(Throwable)
andfail()
variants #3204 - Add
isPrivate
toClass
assertions - Add
doesNot[Start/End]WithWhitespace
methods toCharSequence
assertions #3441 - Add
createAssert(ValueProvider)
toAssertFactory
#3377 - Add
values()
navigation method toAbstractMapAssert
#3297 - Add
bytes()
/bytes(Charset)
/bytes(String)
navigation methods toAbstractStringAssert
#3232 - Add
doesNotThrowAnyExceptionExcept
toAbstractThrowableAssert
#3261 - Add
hasPermittedSubclasses
toClass
assertions #3316 - Add
isUnmodifiable
toIterator
assertions #3477
🐛 Bug Fixes
Core
- Preserve original order of elements when returning duplicates on
doesNotHaveDuplicates
#3333 - Make
isNotEqualTo(boolean)
pass whenactual
isnull
#3343 - Fix
isEqualTo
comparison ofTimestamp
instances withInstant
#3410 - Fix
Instant
conversion withDate
assertions #3467 - Rebuild default date formats used to parse strings as dates when default timezone or lenient flag changes #3382
⚡ Improvements
- Avoid duplicating
maven-javadoc-plugin
configuration and CSS files #3371 - Favor
additionalOption
entries inmaven-javadoc-plugin
Core
- Fix typo in Javadoc #3365
- Improve
AssertFactory
Javadoc - Add
Throwable
stack trace toShouldHaveCauseExactlyInstance
#3351 - Fix typo #3422
- Add
Throwable
stack trace toShouldHaveCauseInstance
#3392 - Implement boolean assertions directly in
AbstractBooleanAssert
and removeBooleans
internal class - Remove stack trace elements triggered by AssertJ in addition to AssertJ elements #3449
🔨 Dependency Upgrades
Core
Guava
- Upgrade to Guava 33.2.0-jre #3454
❤️ Contributors
Thanks to all the contributors who worked on this release:
@Achitheus @csct3434 @armandino @sbrannen @shaikhu @ryber @ranjitshinde91 @tmvlpl @valery1707 @izeye @yyytir777 @pbacz @biergit @Banuelorigni @java-coding-prodigy @vlsi @hazendaz @Kruschenstein @etrandafir93 @pbacz @dehasi
v3.25.3
🐛 Bug Fixes
- Lock
maven-clean-plugin
version for all modules
Core
- Fix a performance regression in the recursive comparison related to
FieldLocation
#3350 - Don't fail when the recursive comparison checks compared fields in collection elements #3349 (proper fix: #3354)
❤️ Contributors
Thanks to all the contributors who worked on this release:
v3.25.2
🐛 Bug Fixes
- Fix unresolvable Javadoc stylesheet URLs, simplify configuration #3324
Core
- Fix missing configuration for
MatcherAssert
soft assertions - Make deprecation notice visible in
AbstractAssert#asList
#3327 - Recursive comparison uses
equals
on root object whenuseOverriddenEquals
is enabled #3320 satisfiesExactlyInAnyOrder
fails ifactual
overridesequals
#3339- Avoid calling
actual.hashCode()
andexpected.hashCode()
inDualValue
#3340 - Recursive comparison checks for existence of fields in types that parameterize nested unordered iterables #3332
❤️ Contributors
Thanks to all the contributors who worked on this release:
v3.25.1
🧩 Binary Compatibility
The release is:
- Binary compatible with the previous minor version.
- Binary incompatible with the previous patch version.
🐛 Bug Fixes
Core
v3.25.0
🚫 Deprecated
Core
- Deprecate the following date/time related assertions in favor of
isCloseTo
:isEqualToIgnoringHours
isEqualToIgnoringMinutes
isEqualToIgnoringSeconds
isEqualToIgnoringMillis
isEqualToIgnoringNanos
isInSameHourAs
isInSameMinuteAs
isInSameSecondAs
- Deprecate
asList
in favor ofasInstanceOf
#3138
✨ New Features
Core
-
Add
Descriptable#describedAs(Supplier<String>)
-
Add
isInThePast
andisInTheFuture
toLocalDate
assertions #2933 -
Add
isInThePast
andisInTheFuture
to the missing Java 8 date/time types #2947 -
Add
isRecord
andisNotRecord
toClass
assertions #2968 -
Add
hasNullValue
anddoesNotHaveNullValue
toAtomicReferenceAssert
#2969 -
Add
asBoolean|Byte|Short|Int|Long|Float|Double
toString
assertions #2580 -
Add
hasRecordComponents
toClass
assertions #2995 -
Add getters for field path in
ComparisonDifference
#3007 -
Allow to compare
enum
andstring
fields in the recursive comparison #2616 -
Provide value when
assertThatThrownBy
/thenThrownBy
fail #3043 -
Add
isSealed
andisNotSealed
toClass
assertions #3080 -
Add
assertThatCharSequence
to disambiguate Groovy'sGString
#3132 -
Change the way the properties are collected using the
Class.getMethods()
API instead of iterating the class hierarchy usingClass.declaredMethods()
#3135 -
Add default constructor for
RecursiveComparator
#3206 -
Add
isPrimitive
andisNotPrimitive
toClass
assertions #2722 -
Add
anyOf(ThrowingConsumer...)
andallOf(ThrowingConsumer...)
#3219Details
What was written as:
assertThat(elements) .extracting(Element::getProperty) .allSatisfy(p -> assertThat(p).satisfiesAnyOf( p1 -> assertThat(p1).isNull(), p1 -> assertThat(p1).isNotNull().extracting(Property::getId).isEqualTo(expected) ));
can now be shortened to:
assertThat(elements) .extracting(Element::getProperty) .allSatisfy(anyOf( // statically imported from Assertions p1 -> assertThat(p1).isNull(), p1 -> assertThat(p1).isNotNull().extracting(Property::getId).isEqualTo(expected) ));
-
Show the array/iterable under test in the assertion error message when it is not empty but should have been #3230
🐛 Bug Fixes
Core
- Compare Java types from
javax
andcom.sun
by their equals method in recursive comparison #2928 - The recursive comparison
comparingOnlyFields
did not treat array/iterable elements as root objects #2994 - Fixes a bug when failing assertions on
DirectoryStream
types #3036 - Fix handling of null containers in the recursive assertion #3045
- Handle null values in map entry sets when formatting #3087
- Fix NPE when expected and actual field values are null #3034
- Fix NPE on
anyMatch
whenactual
containsnull
andObjects::isNull
is used as predicate #3151 - Fix misleading subsequence failure messages in string assertions #3166
- Do not ignore nested fields of types specified in
comparingOnlyFieldsOfTypes
#3207 containsExactly
does not work properly with maps not using equals to compare keys #2165- Escape percentage in
shouldContainExactly
error message #3288 - Fix recursive comparison of ignored types in unordered collection #3287
⚡ Improvements
- Add Spotless #3115
Core
-
Use Bnd feature to write resolved
bndrun
files to output folder #2902 -
Add
Throwable
stack trace toShouldHaveClause
#2872 -
Avoid copy of any
Collection
instance inIterables::assertContains
-
Add
Throwable
stack trace toShouldHaveRootCauseInstance
andShouldHaveRootCauseExactlyInstance
#2910 -
Add missing description to nested condition #2755
-
Make nestable condition factory accept conditions on super types #2905
-
Add varargs overload to
Assert::hasString
andAssert::doesNotHaveString
#2945 -
Improve recursive comparison performance by caching field and field names result #2979
-
Document performance cost of ignoring collection order
-
Track visited values and their comparison differences so that they can be reused #2954
-
Use hash code for
compareUnorderedIterables
to improve performance in some common cases #3020 -
Improve recursive comparison error message regarding
equals
methods used for JDK types #2678 -
Format large arrays as strings #3065
-
Remove null check as
isArray
already performs it -
Fix
PrimitiveArralList
/TransformlingList
test file names #3124 -
Add exception for usages of
isEqualTo
andisNotEqualTo
on assertions #2921Details
Before this change, the following code:
AbstractAssert<?, ?> assertion = assertThat(something); assertThat(assertion).isEqualTo(assertion);
would throw an exception with a message about
equals
being unsupported, suggesting to useisEqualTo
instead. The message is somewhat confusing to the reader, sinceisEqualTo
is indeed used, and is becauseisEqualTo
internally relies on theequals
ofactual
, which is anAbstractAssert
instance and throws the exception above.isEqualTo
andisNotEqualTo
now check ifactual
is an assertion instance and raise anUnsupportedOperationException
if so, with a message suggesting to useisSameAs
andisNotSameAs
instead.This is, for example, useful for testing custom assertion types for extension libraries, where the use of
satisfies
instead ofisEqualTo
may be desirable. -
Add check for missing fields in recursive comparison where specific fields are requested for comparison
-
Improve efficiency of iterable string conversion #3123
-
Add more tests for
usingRecursiveComparison
#2790 -
Checks that compared fields exist before running the recursive comparison #3129
-
Remove
maven-surefire-plugin
duplicate version #3180 -
Remove Maven default goal #3182
-
Add dependency graph workflow
-
Normalize non-breaking spaces like regular white spaces #3120
-
AbstractOffsetDateTimeAssert::isBetween
parameter names should useinclusive
, notexclusive
#3217 -
Invoke
isNotNull
inreturns
anddoesNotReturn
#3224 -
Cache node names in
ComparingFields
,ComparingProperties
#3242 -
Cache node names in
ComparingNormalizedFields
-
Use simpler syntax in
DefaultRecursiveComparisonIntrospectionStrategy.getChildrenNodeNamesOf
-
Update to Contributor Covenant Code of Conduct v2.1
-
Correct
contains
assertion Javadoc to reflect method behavior in case actual is not empty and the group of values to look for is #3256 -
Fix Javadoc typos #3265
-
Improving null-safety of
isEqualToNormalizingNewlines
#2776 -
Speed up for
BinaryDiff
performance #3193 -
Upgrade workflows to Java 21 #3191
-
Apply
flatten-maven-plugin
toassertj-core
andassertj-guava
#3311
🔨 Dependency Upgrades
Core
- Upgrade to Byte Buddy 1.14.11 #330
- Upgrade to JUnit BOM 5.10.1 #3254
- Upgrade to OpenTest4J 1.3.0 #3122
Guava
- Upgrade to Guava 32.1.3-jre #3218
❤️ Contributors
Thanks to all the contributors who worked on this release:
@bjhargrave @vlsi @Ds2994 @StefanBratanov @alex859 @ascopes @ljrmorgan @ghkim3221 @hezean @matthew-leng @etellman @hjir @amodolo @armandino @aindriu-aiven @Bananeweizen @JohnBryte @ManuelG28 @maximedezette @radistao @ykardziyaka @wouterpolet @sarajuhosova @pbacz @Gabriel-Darbord @Nacho321 @marcela-cardona-s @matthiaskraaz @quaff @grigala @martinfrancois @georgebax