JUNIT 테스트 무효 메서드
빈 메서드로 가득 찬 자바 클래스가 있으며 최대 코드 적용 범위를 얻기 위해 단위 테스트를 만들고 싶습니다.
예를 들어 다음과 같은 방법이 있습니다.
protected static void checkifValidElements(int arg1, int arg2) {
method1(arg1);
method2(arg1);
method3(arg1, arg2);
method4(arg1, arg2);
method5(arg1);
method6(arg2);
method7();
}
더 나은 이해를 위해 코드를 번역했기 때문에 이름이 잘못되었습니다. 각 메소드는 인수가 어떤 식 으로든 유효하고 잘 작성되었는지 확인합니다.
예 :
private static void method1(arg1) {
if (arg1.indexOf("$") == -1) {
//Add an error message
ErrorFile.errorMessages.add("There is a dollar sign in the specified parameter");
}
}
내 단위 테스트는 ErrorFile에 오류 메시지가 포함되어 있는지 확인하도록 요청하기 때문에 작은 메서드를 잘 다루고 있지만 checkIfValidElements 메서드를 테스트 할 수있는 방법을 볼 수 없으며 아무것도 반환하지 않거나 아무것도 변경하지 않습니다. Maven으로 코드 커버리지를 실행하면 단위 테스트가 내 클래스의이 부분을 다루고 있다고 알려줍니다.
내가 보는 유일한 방법은 다음과 같이 int 또는 bollean 값을 반환하도록이 메서드를 변경하는 것입니다.
protected static int checkifValidElements(int arg1, int arg2) {
method1(arg1);
method2(arg1);
method3(arg1, arg2);
method4(arg1, arg2);
method5(arg1);
method6(arg2);
method7();
return 0;
}
이 방법을 사용하면 같음을 주장 할 수 있지만 이렇게하는 것은 헛된 것 같습니다. 문제는 이와 같이 설계된 두 개의 클래스가 있고 단위 테스트 범위 %가 낮아진다는 것입니다.
최대한의 코드 커버리지를 얻기 위해 단위 테스트를 만들고 싶습니다.
코드 커버리지가 단위 테스트 작성 의 목표가 되어서는 안됩니다 . 단위 테스트를 작성하여 코드가 올바른지 증명하거나 더 나은 디자인을 돕거나 다른 사람이 코드의 의미를 이해하도록 도와야합니다.
하지만 어떻게 내 메서드 checkIfValidElements를 테스트 할 수 있는지 모르겠지만 아무것도 반환하지 않거나 아무것도 변경하지 않습니다.
글쎄, 당신은 아마 몇 가지 테스트를 제공해야 할 것입니다. 그 사이에 7 개의 메서드가 모두 적절하게 호출되는지 확인해야합니다. 유효하지 않은 인수와 유효한 인수를 사용하여 ErrorFile
매번 결과를 확인합니다 .
예를 들어, 누군가 다음 호출을 제거했다고 가정합니다.
method4(arg1, arg2);
... 또는 실수로 인수 순서를 변경했습니다.
method4(arg2, arg1);
이러한 문제를 어떻게 알 수 있습니까? 그것을 증명하기 위해 테스트를 설계하십시오.
메서드에 부작용이없고 아무것도 반환하지 않으면 아무 작업도 수행하지 않는 것입니다.
메서드가 일부 계산을 수행하고 해당 계산의 결과를 반환하는 경우 반환 된 결과가 정확하다고 충분히 주장 할 수 있습니다.
코드가 아무 것도 반환하지 않지만 부작용이있는 경우 코드를 호출 한 다음 올바른 부작용이 발생했다고 주장 할 수 있습니다. 부작용이 무엇인지에 따라 검사 방법이 결정됩니다.
귀하의 예제에서는 반환되지 않는 함수에서 정적 메서드를 호출하고 있으므로 이러한 모든 정적 메서드의 결과가 올바른지 검사 할 수없는 경우 까다로워집니다. 테스트 관점에서 더 좋은 방법은 메서드를 호출하는 실제 개체를 삽입하는 것입니다. 그런 다음 EasyMock 또는 Mockito와 같은 것을 사용하여 단위 테스트에서 모의 객체를 만들고 클래스에 모의 객체를 삽입 할 수 있습니다. 그런 다음 모의 객체를 사용하면 올바른 값과 올바른 순서로 올바른 함수가 호출되었는지 확인할 수 있습니다.
예를 들면 :
private ErrorFile errorFile;
public void setErrorFile(ErrorFile errorFile) {
this.errorFile = errorFile;
}
private void method1(arg1) {
if (arg1.indexOf("$") == -1) {
//Add an error message
errorFile.addErrorMessage("There is a dollar sign in the specified parameter");
}
}
그런 다음 테스트에서 다음과 같이 작성할 수 있습니다.
public void testMethod1() {
ErrorFile errorFile = EasyMock.createMock(ErrorFile.class);
errorFile.addErrorMessage("There is a dollar sign in the specified parameter");
EasyMock.expectLastCall(errorFile);
EasyMock.replay(errorFile);
ClassToTest classToTest = new ClassToTest();
classToTest.setErrorFile(errorFile);
classToTest.method1("a$b");
EasyMock.verify(errorFile); // This will fail the test if the required addErrorMessage call didn't happen
}
적절한 부작용이 있다고 주장하여 void 메서드를 단위 테스트 할 수 있습니다. 귀하의 method1
예에서 단위 테스트는 다음과 같습니다.
public void checkIfValidElementsWithDollarSign() {
checkIfValidElement("$",19);
assert ErrorFile.errorMessages.contains("There is a dollar sign in the specified parameter");
}
You can learn something called "mocking". You can use this, for example, to check if: - a function was called - a function was called x times - a function was called at least x times - a function was called with a specific set of parameters. In your case, for example, you can use mocking to check that method3 was called once with whatever you pass as arg1 and arg2.
Have a look at these: https://code.google.com/p/mockito/ https://code.google.com/p/powermock/
I think you should avoid writing side-effecting method. Return true or false from your method and you can check these methods in unit tests.
If your method is void and you want to check for an exception, you could use expected
: https://weblogs.java.net/blog/johnsmart/archive/2009/09/27/testing-exceptions-junit-47
If it is possible in your case, you could make your methods method1(arg1)
... method7()
protected instead of private so they could be accesible from test class within the same package. Then you can simply test all theese methods separately.
ReferenceURL : https://stackoverflow.com/questions/16043819/junit-testing-void-methods
'program tip' 카테고리의 다른 글
Eclipse 패키지 탐색기 : 긴 패키지 이름의 일부를 숨기시겠습니까? (0) | 2020.12.25 |
---|---|
HTML 버튼이 POST 요청을 수행 할 수 있습니까? (0) | 2020.12.25 |
div 대신 HTML5 시맨틱 태그를 사용하는 이유는 무엇입니까? (0) | 2020.12.25 |
Mysql Workbench GUI에서 테이블 내용을 보는 방법은 무엇입니까? (0) | 2020.12.25 |
SELECT… FOR XML PATH ( ''), 1,1)의 의미는 무엇입니까? (0) | 2020.12.25 |