클래스에서 예외를 테스트하려고합니다. 나는 몇 가지 다른 방법을 시도해 왔지만 아무것도 작동하지 않습니다. 내가 여기서 뭘 잘못하고 있니?
테스트하려는 클래스 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 to int
int primeNumberInt = Integer.parseInt(primeNumberStr);
// Beginning of return message
resultStr += primeNumberInt + " is ";
// Add "not" if it's not a prime
if (!Primes.isPrime(primeNumberInt))
resultStr += "NOT ";
// End return message
resultStr += "a prime";
// If not a 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 but not valid
else
resultStr += primeNumberStr + " is not a valid number";
resultStr += ". Only numbers without decimals are accepted.";
}
return resultStr;
}
}
그리고 이제 내가 테스트하려고 시도한 것 :
주석 포함
@Test(expected = NumberFormatException.class)
public void testNumberFormatExceptionBeingThrown() {
PrimeNumber primeNumber = new PrimeNumber("6dg");
primeNumber.getPrimeResult();
}
실패한 테스트 결과 :
java.lang.AssertionError: Expected exception: java.lang.Exception
JUnit 규칙 사용 :
@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();
}
결과 :
java.lang.AssertionError: Expected test to throw (an instance of java.lang.NumberFormatException and exception with message a string containing "For input string: \"a21\"")
at org.junit.Assert.fail(Assert.java:88)
at org.junit.rules.ExpectedException.failDueToMissingException(ExpectedException.java:263)
at org.junit.rules.ExpectedException.access$200(ExpectedException.java:106)
at org.junit.rules.ExpectedException$ExpectedExceptionStatement.evaluate(ExpectedException.java:245)
at org.junit.rules.RunRules.evaluate(RunRules.java:20)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:78)
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:212)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:68)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)
모든 것이 정상적으로 작동합니다. 메서드에서 예외가 발생 하지 않도록 성공적으로 막을 수있었습니다 . 당신은 성공적으로 그들이하는지 테스트 할 수있었습니다 할 던져 예외.
두 가지를 동시에하는 것은 말이되지 않습니다. 잘못된 인수가 주어 졌을 때 각 메서드에서 예외를 throw 할지 여부 를 결정해야합니다 .
당신이 경우 잘못된 인수가 주어 졌을 때 예외를 던지는 방법을 원하고 잡아 예외를 처리, 그냥이 슬로우하지 않습니다. 그런 다음 위에서 한 것처럼 메서드가 해당 예외를 throw하는지 테스트합니다.
잘못된 인수가 주어 졌을 때 메서드가 예외를 throw 하지 않도록 하려면 대신 수행 할 작업을 결정하십시오. 그런 다음 방법이 원하는대로 작동하는지 테스트합니다. 예외가 발생하면 테스트가 실패합니다.
즉, 수업에서 숫자를 처리하는 방법은별로 의미가 없습니다. 당신은 그것들을 String
s 로 가져오고 s로 저장하고 String
s로 반환 String
하지만, 작업 할 때마다 s로 앞뒤로 변환합니다 int
. int
애초에 어디서나 사용하지 않는 이유는 무엇 입니까?
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다