Path: csiph.com!x330-a1.tempe.blueboxinc.net!newsfeed.hal-mli.net!feeder3.hal-mli.net!newsfeed.hal-mli.net!feeder1.hal-mli.net!nx02.iad01.newshosting.com!newshosting.com!69.16.185.11.MISMATCH!npeer01.iad.highwinds-media.com!news.highwinds-media.com!feed-me.highwinds-media.com!post01.iad.highwinds-media.com!newsfe13.iad.POSTED!83aa503d!not-for-mail From: Daniel Pitts User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:8.0) Gecko/20111105 Thunderbird/8.0 MIME-Version: 1.0 Newsgroups: comp.lang.java.programmer Subject: Re: Question re testing constructor References: In-Reply-To: Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Lines: 62 Message-ID: X-Complaints-To: abuse@newsrazor.net NNTP-Posting-Date: Tue, 06 Dec 2011 17:49:21 UTC Date: Tue, 06 Dec 2011 09:49:21 -0800 Xref: x330-a1.tempe.blueboxinc.net comp.lang.java.programmer:10565 On 12/6/11 7:14 AM, Novice wrote: > I'm writing JUnit test cases for a constructor but have hit a bit of a > snag. I hope someone here can help. > > I've satisfied myself via googling that it makes sense to test constructors > if they do something that might fail or if they can throw exceptions. The > constructor in question can throw exceptions so I'm trying to write some > test cases for it. I've got cases that cause each of the exceptions to be > thrown but I'm having a bit of a problem with what seemed like the easiest > test of all: existence. > > It seems to me - correct me if I'm wrong - that I can easily test to make > sure the constructor actually built SOMETHING by testing the object against > null. That won't prove it created exactly the right object but it will > prove that something got created. Testing the objects OTHER methods will > verify that the correct object got created. > > If that is right, then it seems that this should test the existence of the > object well enough: > > Set testValues = new HashSet(); > testValues.add("FF0000"); > testValues.add("66CC99"); > > for (String key : testValues) { > HexColor hexColor = new HexColor(key); > if (hexColor == null) { > assertTrue("The HexColor has been created for input value, > " + key + ", but has been found to be null.", false); > } > } > > Unfortunately, the assertTrue() statement gets flagged by the compiler as > being dead code. Am I right in assuming that it is essentially looking at > the instantiation of the HexColor class and reasoning that it will > inevitably create SOMETHING so that hexColor can't possibly be null, > therefore the assertTrue() can't ever be executed? > > If so, I don't have a problem with that but it leaves me a bit baffled > about how to test that the constructor created something when I gave it > good input values. > > Can someone enlighten me on a better way to test this aspect of the > constructor? Or can I simply assume that the constructor worked as long as > it didn't actually throw an exception and omit any existence tests? > Tests work best if you think about pre-conditions and post-conditions. Test 1: Pre condition: I pass these objects to a constructor... Expected post conditions: I have an object with these state/behavior. Test 2: Pre condition: I pass these other objects to a constructor... Expected post condition: Constructor throws NullPointerException. Etc... So, if your constructor is non-trivial, you should be able to interact with the object to verify the constructor did its job.