From: SourceForge.net <no...@so...> - 2009-11-18 20:31:15
|
Feature Requests item #1550922, was opened at 2006-09-02 04:20 Message generated for change (Comment added) made by dsaff You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=365278&aid=1550922&group_id=15278 Please note that this message will contain a full copy of the comment thread, including the initial issue submission, for this request, not just the latest update. Category: None Group: None >Status: Closed >Resolution: Fixed Priority: 5 Private: No Submitted By: Jesse Glick (jglick) Assigned to: Nobody/Anonymous (nobody) Summary: Assert should check types on Object Initial Comment: org.junit.Assert.assertEquals should have a signature such as public static <T> void assertEquals(T expected, T actual); rather than using (Object,Object). Similarly for the variant taking a message, of course. The additional typecheck would turn a dumb mistake such as this: List<String> names = ...; ... assertEquals(Collections.singleton("foo"), names); // ^^^^^^^^^ // should be: singletonList into a compile-time error, rather than the cryptic test failure message expected:<[foo]> but was:<[foo]> ---------------------------------------------------------------------- >Comment By: David Saff (dsaff) Date: 2009-11-18 15:31 Message: Thanks, Jesse ---------------------------------------------------------------------- Comment By: Jesse Glick (jglick) Date: 2009-11-16 18:20 Message: commit de7ac4a1c3c7c9e59befe41d120daaa7827b7b24 Author: kbeck <kbeck> Date: Thu Feb 8 03:29:22 2007 +0000 Added class names to error message when two values fail the equality test but produce the same toString(). ---------------------------------------------------------------------- Comment By: Jesse Glick (jglick) Date: 2009-11-16 18:11 Message: Seems JUnit 4.5 has already fixed this anyway: @Test public void compareTypes() { assertEquals(Collections.singleton(5), Arrays.asList(5)); } => expected: java.util.Collections$SingletonSet<[5]> but was: java.util.Arrays$ArrayList<[5]> ---------------------------------------------------------------------- Comment By: David Saff (dsaff) Date: 2009-11-16 12:52 Message: This tracker is being shut down. Please move this item to http://github.com/KentBeck/junit/issues ---------------------------------------------------------------------- Comment By: Jesse Glick (jglick) Date: 2006-09-06 11:02 Message: Logged In: YES user_id=257383 Sets and lists are not considered equal. The example should have been corrected to e.g. assertEquals(Collections.singleton("foo"), new HashSet<String>(names)); I would like to see something like expected: java.util.ArrayList <[foo]> but was: java.util.Collections$SingletonSet <[foo]> ---------------------------------------------------------------------- Comment By: Matthias Schmidt (cmschmidt) Date: 2006-09-06 10:48 Message: Logged In: YES user_id=1523407 ARE a List and a Set not Comparable? Both are Collections resp. Iterables. Depending on your program, you would either have to compare their class types (1) or their content (2). Both is possible. 1: assertTrue( set.getClass() != list.getClass() ); 2: assertEquals(set.toArray(), list.toArray() ); Regarding your alternate strategy: I like the idea to enhance the error message to something like "List <[]> expected but was Set <[]>". Was it that what you meant? ---------------------------------------------------------------------- Comment By: Jesse Glick (jglick) Date: 2006-09-06 09:55 Message: Logged In: YES user_id=257383 I meant to prevent a comparison between e.g. Set<String> and List<String>. Unfortunately it seems javac will just treat this as <Object>assertEquals(..., ...); which does not help anything. So it will not work. Alternate strategy: in assertEquals, if the args are not equal but their toString()s are equal, instead/additionally print the impl class (o.getClass().getName()) of each. That would at least clue you in to the fact that a List and a Set are not comparable. I could supply a patch if you want one, but it should be easy. ---------------------------------------------------------------------- Comment By: Matthias Schmidt (cmschmidt) Date: 2006-09-04 07:52 Message: Logged In: YES user_id=1523407 Are you sure there is a compile time error? I have rewritten the assertEquals method as you suggested and written a test like this: @Test public void stringTest() { List<String> names = new ArrayList<String>(); names.add("foo"); assertEquals(Collections.singleton("foo"), names); } and the failure message was "expected:<[foo]> but was:<[foo]>". So no real improvement here ;) I am not sure if I understand what kind of typecheck you would like to do. Is it to prevent to not be able to compare e.g. a Boolean to an ArrayList? ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=365278&aid=1550922&group_id=15278 |