Skip to content

satisfies() with nested assertions obscures stack trace #2542

@perlun

Description

@perlun

Summary

satisfies() with nested assertions obscures stack trace

Example

We have a satisfies() call with many embedded assertions like this. AssertJ doesn't expose the stack trace of the actual line that triggered the assertion in this case, only the satisfies() line:

assertThat( tsdbDeviceMediator.getDeviceSnapshots( 1 ) )
        .singleElement()
        .satisfies( tsdbDevice -> {
            assertThat( tsdbDevice.getRevision() ).isEqualTo( 1 );
            assertThat( tsdbDevice.getPlatform() ).isEqualTo( "IOS" );
            assertThat( tsdbDevice.getProfile() ).isEqualTo( "ios" );
            assertThat( tsdbDevice.getProfileOverrides() ).isEqualTo( "IOS" );
            assertThat( tsdbDevice.getModel() ).isEqualTo( "IOS" );
            assertThat( tsdbDevice.getFirmwareVersion() ).isEqualTo( "IOS" );
            assertThat( tsdbDevice.getSerialNumber() ).isEqualTo( "IOS" );
            assertThat( tsdbDevice.isDynamicIpAddress() ).isEqualTo( "IOS" );
            assertThat( tsdbDevice.getIpAddress() ).isEqualTo( "IOS" );
            assertThat( tsdbDevice.getMacAddress() ).isEqualTo( "IOS" );
            assertThat( tsdbDevice.getSecondaryMacAddress() ).isEqualTo( "IOS" );
            assertThat( tsdbDevice.getAlias() ).isEqualTo( "IOS" );
            assertThat( tsdbDevice.getTvModelId() ).isEqualTo( "IOS" );
            assertThat( tsdbDevice.getDisplayMode() ).isEqualTo( "IOS" );
            assertThat( tsdbDevice.getSkinResolution() ).isEqualTo( "IOS" );
            assertThat( tsdbDevice.getMaxAgeRating() ).isEqualTo( "IOS" );
            assertThat( tsdbDevice.isTombstone() ).isFalse();
        } );

Here's what it looks like when I run this in IntelliJ. Line 222 is highlighted in the stack trace, but not the actual exception-triggering line:

image

Interestingly enough, if I wrap this in a try/catch like below and rethrow it as a RuntimeException, it starts working much better:

assertThat( tsdbDeviceMediator.getDeviceSnapshots( 1 ) )
        .singleElement()
        .satisfies( tsdbDevice -> {
            try {
                assertThat( tsdbDevice.getRevision() ).isEqualTo( 1 );
                assertThat( tsdbDevice.getPlatform() ).isEqualTo( "IOS" );
                assertThat( tsdbDevice.getProfile() ).isEqualTo( "ios" );
                assertThat( tsdbDevice.getProfileOverrides() ).isEqualTo( "IOS" );
                assertThat( tsdbDevice.getModel() ).isEqualTo( "IOS" );
                assertThat( tsdbDevice.getFirmwareVersion() ).isEqualTo( "IOS" );
                assertThat( tsdbDevice.getSerialNumber() ).isEqualTo( "IOS" );
                assertThat( tsdbDevice.isDynamicIpAddress() ).isEqualTo( "IOS" );
                assertThat( tsdbDevice.getIpAddress() ).isEqualTo( "IOS" );
                assertThat( tsdbDevice.getMacAddress() ).isEqualTo( "IOS" );
                assertThat( tsdbDevice.getSecondaryMacAddress() ).isEqualTo( "IOS" );
                assertThat( tsdbDevice.getAlias() ).isEqualTo( "IOS" );
                assertThat( tsdbDevice.getTvModelId() ).isEqualTo( "IOS" );
                assertThat( tsdbDevice.getDisplayMode() ).isEqualTo( "IOS" );
                assertThat( tsdbDevice.getSkinResolution() ).isEqualTo( "IOS" );
                assertThat( tsdbDevice.getMaxAgeRating() ).isEqualTo( "IOS" );
                assertThat( tsdbDevice.isTombstone() ).isFalse();
            }
            catch ( Throwable t ) {
                throw new RuntimeException( t );
            }
        } );

Line 227 is properly listed in the stack trace, making it much easier to debug the actual cause of the problem:

image

Conclusion

Could this be a bug in IntellIJ or AssertJ? 🤔 I tried playing with Assertions.setRemoveAssertJRelatedElementsFromStackTrace(false) but it didn't seem to affect this.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions