Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Throw ComparisonFailure rather than AssertionError for all equals methods #1416

Open
liamsharp opened this issue Feb 3, 2017 · 6 comments
Open

Comments

@liamsharp
Copy link

I'd like to propose a change that I think would make the assertEquals methods easier to work with - apologies if I've missed something.

When a test fails in Eclipse with assertEquals() and the parameters are not strings, an AssertionError is thrown. This gives a backtrace, but to see what was not equal, I have to copy and paste out the error into another editor to read the top line. Here's a screen shot:

screen shot 2017-02-03 at 18 49 26

It would be great if could throw a ComparisonFailure. I'd still see pretty much the same failure trace:

screen shot 2017-02-03 at 18 52 05

but I'd be about to double click it/click the "Compare with Expected Results" button and get this:

screen shot 2017-02-03 at 18 52 20

which would be a tremendous help to my work flow.

When looking into this I did think surely Eclipse could do something better, but I don't think it can. An AssertionError doesn't have the expected and actual results. They are thrown away by the call to failNotEquals which calls 'format' that then concatenates a single string to pass to AssertionError

So looking at assertEquals for Object's could we just do away with the instanceof checks?

public static void assertEquals(String message, Object expected,
            Object actual) {
        if (equalsRegardingNull(expected, actual)) {
            return;
        }
        if (expected instanceof String && actual instanceof String) {
            String cleanMessage = message == null ? "" : message;
            throw new ComparisonFailure(cleanMessage, (String) expected,
                    (String) actual);
        } else {
            failNotEquals(message, expected, actual);
        }
    }
@kcooney
Copy link
Member

kcooney commented Feb 3, 2017

We would most likely do this by integrating with https://github.com/ota4j-team/opentest4j but we need some changes there so JUnit4 can use those APIs. See ota4j-team/opentest4j#27

@kcooney
Copy link
Member

kcooney commented Feb 4, 2017

Incidentally, the reason why this isn't so simple is you might get an exception when calling toString() on the expected and/or actual values.

@xcjm
Copy link

xcjm commented Feb 22, 2017

wow ,I want to learn,but it can't load .can you send me resoure to load the Junit4.Thanks

@xcjm
Copy link

xcjm commented Feb 22, 2017

my email [email protected].

@j256
Copy link

j256 commented Jan 4, 2021

Incidentally, the reason why this isn't so simple is you might get an exception when calling toString() on the expected and/or actual values.

We could put catches around the toString() calls and fallback to Object.toString() if they throw.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants