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 string
s, storing them string
s, , returning them string
s, whenever work them, convert them , forth int
s. why not use int
everywhere in first place?
Comments
Post a Comment