java - JUnit: Test exception doesn't work (AssertionError: Expected exception even if exception thrown) -


i'm trying test class exception. i've been trying couple different methods, nothing works. doing wrong here?

the class i'm trying test, primenumber.java:

public class primenumber {      static final logger log = logmanager.getlogger("log");      private string primenumberstr;      public primenumber(string primenumberstr) {         this.primenumberstr = primenumberstr;     }      public string getprimeresult() {         string resultstr = "";         try {             // convert user input int             int primenumberint = integer.parseint(primenumberstr);             // beginning of return message             resultstr += primenumberint + " ";             // add "not" if it's not prime             if (!primes.isprime(primenumberint))                 resultstr += "not ";             // end return message             resultstr += "a prime";             // if not valid number, catch         } catch (numberformatexception e) {             // log exception             log.warn("numberformatexception" + e.getmessage());             // if empty user input             if (primenumberstr.length() == 0)                 resultstr += "no number inserted";             // else not empty not valid             else                 resultstr += primenumberstr + " not valid number";             resultstr += ". numbers without decimals accepted.";         }          return resultstr;     }  } 

and things i've tried test:

with annotation

@test(expected = numberformatexception.class) public void testnumberformatexceptionbeingthrown() {     primenumber primenumber = new primenumber("6dg");     primenumber.getprimeresult(); } 

results in failed test and:

java.lang.assertionerror: expected exception: java.lang.exception 

with junit rule:

@rule public expectedexception thrown = expectedexception.none();  @test(expected = numberformatexception.class) public void testnumberformatexceptionbeingthrown() {     thrown.expect(numberformatexception.class);     thrown.expectmessage("for input string: \"a21\"");     primenumber primenumber = new primenumber("a21");     primenumber.getprimeresult(); } 

results in:

java.lang.assertionerror: expected test throw (an instance of java.lang.numberformatexception , exception message string containing "for input string: \"a21\"") @ org.junit.assert.fail(assert.java:88) @ org.junit.rules.expectedexception.failduetomissingexception(expectedexception.java:263) @ org.junit.rules.expectedexception.access$200(expectedexception.java:106) @ org.junit.rules.expectedexception$expectedexceptionstatement.evaluate(expectedexception.java:245) @ org.junit.rules.runrules.evaluate(runrules.java:20) @ org.junit.runners.parentrunner.runleaf(parentrunner.java:325) @ org.junit.runners.blockjunit4classrunner.runchild(blockjunit4classrunner.java:78) @ org.junit.runners.blockjunit4classrunner.runchild(blockjunit4classrunner.java:57) @ org.junit.runners.parentrunner$3.run(parentrunner.java:290) @ org.junit.runners.parentrunner$1.schedule(parentrunner.java:71) @ org.junit.runners.parentrunner.runchildren(parentrunner.java:288) @ org.junit.runners.parentrunner.access$000(parentrunner.java:58) @ org.junit.runners.parentrunner$2.evaluate(parentrunner.java:268) @ org.junit.runners.parentrunner.run(parentrunner.java:363) @ org.junit.runner.junitcore.run(junitcore.java:137) @ com.intellij.junit4.junit4ideatestrunner.startrunnerwithargs(junit4ideatestrunner.java:78) @ com.intellij.rt.execution.junit.junitstarter.preparestreamsandstart(junitstarter.java:212) @ com.intellij.rt.execution.junit.junitstarter.main(junitstarter.java:68) @ sun.reflect.nativemethodaccessorimpl.invoke0(native method) @ sun.reflect.nativemethodaccessorimpl.invoke(nativemethodaccessorimpl.java:62) @ com.intellij.rt.execution.application.appmain.main(appmain.java:140) 

everything's working should. you've been able prevent methods throwing exceptions. you've been able test do throw exceptions.

it's just, doesn't make sense both @ same time. you need decide if want each method throw exception or not when given wrong arguments.

if do want method throw exception when given wrong argument, don't catch , handle exception, let thrown. then, test method throws exception, did above.

if don't want method throw exception when given wrong argument, decide want instead. then, test method want to. if throws exception, test fail.


that said, way handle numbers in class doesn't make sense. you're getting them strings, storing them strings, , returning them strings, whenever work them, convert them , forth ints. why not use int everywhere in first place?


Comments

Popular posts from this blog

c# - Validate object ID from GET to POST -

php - Find a regex to take part of Email -

javascript - Function overwritting -