Java 테스트 비공개 메소드는 비공개 액세스 수정자를 갖는 메소드로 정의되며 정의 클래스에서만 액세스하도록 제한되며 재정의할 수 없는 하위 클래스에서는 표시되지 않습니다. 그러나 다음을 정의할 수 있습니다. 하위 클래스에서 동일한 이름을 갖고 상위 클래스에서 액세스할 수 있는 메소드, 동일한 패키지의 테스트 클래스에서 JUnit을 사용하여 직접 테스트할 수 있는 비공개 메소드 패키지 액세스를 만들어 비공개 메소드를 테스트할 수도 있습니다. SuiteRunner의 개인 메소드는 JUnit에서 테스트하는 것보다 쉽습니다.
무료 소프트웨어 개발 과정 시작
웹 개발, 프로그래밍 언어, 소프트웨어 테스팅 등
JUnit을 사용하든 SuiteRunner를 사용하든 비공개 메서드를 테스트하는 네 가지 기본 접근 방식이 있습니다.
가끔 프라이빗 메서드가 매우 복잡한 작업을 수행하고 테스트를 잘 테스트해야 하므로 프라이빗 메서드를 보호해야 하기 때문에 사용자가 이러한 메서드에 액세스하는 것을 원하지 않습니다.
프라이빗 메서드는 간접적으로 테스트할 수 없으며 이를 호출하는 퍼블릭 메서드에 미치는 영향만 테스트할 수 있습니다. 비공개 메서드를 테스트하는 것은 해당 메서드가 재사용성을 지원/지원하는 다른 클래스로 이동되었음을 나타낼 수 있습니다.
이미 작동하고 있고 단위 테스트 적용 범위가 좋은 비공개 메서드를 추출하면 테스트하기에 충분한 단위 테스트에 이미 존재하므로 비공개 메서드에 대해 더 많은 단위 테스트를 작성할 필요가 없습니다. 하지만 호출 메서드보다 프라이빗 메서드를 작성하고 프라이빗 메서드를 작성하기 전에 단위 테스트를 작성하고 싶다면
예
public class testClass { private String testMethod(String s) { return s; } }
위의 샘플 예는 비공개 메서드 테스트에만 사용됩니다. 'testClass' 클래스가 있는 경우 'testMethod( )'라는 메소드에 의해 호출되며 해당 메소드는 비공개이며 문자열이나 객체를 전달하여 값을 반환할 수 있습니다.
메서드 패키지 액세스 권한을 부여하는 것은 JUnit을 사용하여 비공개 메서드를 테스트하는 데 적합하지만 약간의 비용이 듭니다. 비공개 액세스 수정자가 있는 메소드는 클래스 구현의 일부입니다. 패키지에 있는 다른 클래스의 클래스를 사용하려고 하면 이 방법을 무시할 수 있으며 패키지 액세스 방법을 사용하여 이를 알아낼 수 있습니다. 또한 메소드 액세스 패키지를 사용하여 클래스의 비공개 메소드 테스트를 수행할 수 있습니다.
액세스 한정자 없이 메서드 패키지를 비공개로 만들고 동일한 패키지에 테스트를 넣는 첫 번째 방법은 일반적인 방법이지만 여전히 다른 코드가 필요한 경우 두 번째 방법은 메서드를 공개로 만드는 것입니다.
Java에서 비공개 메서드를 테스트할 때 세 번째는 중첩된 테스트 클래스를 사용하는 것입니다. 이는 테스트 중인 프로덕션 클래스 내에 정적 클래스를 중첩하여 수행할 수 있습니다. 중첩 클래스는 자신을 둘러싸는 클래스의 전용 멤버에 액세스할 수 있으므로 전용 메서드를 직접 호출할 수 있습니다. 정적 클래스 자체는 패키지 액세스가 될 수 있으므로 화이트 박스 테스트의 로드 부분이 될 수 있습니다.
이 중첩 테스트 클래스의 단점은 부서 JAR 파일에서 중첩 클래스에 액세스할 수 없도록 하려면 이를 추출하기 위해 추가 작업을 수행해야 한다는 것입니다. 품질 분석가가 소스 코드를 변경하므로 이는 문제가 될 수 있습니다.
이제 다음 반사 사용 방법을 살펴보겠습니다. 프라이빗 메서드 테스트에 리플렉션을 사용하면 테스트 코드와 프로덕션 코드가 깔끔하게 분리된다는 장점이 있습니다. 중첩 클래스 접근 방식에서 이미 확인했듯이 클래스가 테스트 중인 클래스 내부에서 테스트를 테스트할 필요는 없지만 클래스의 패키지 수준 및 공개 메서드를 실행하는 다른 테스트와 함께 배치할 수 있습니다. 중첩 클래스를 사용하면 패키지 액세스 수준에서 중첩 클래스를 추가할 필요가 없습니다.
리플렉션은 런타임 시 메서드, 클래스, 인터페이스의 동작을 검사하거나 수정하는 데 사용되는 API입니다. 리플렉션 사용의 단점은 리플렉션 API를 사용하기 때문에 테스트 코드가 훨씬 지루하다는 것입니다.
예: 리플렉션 사용을 설명하는 Java 프로그램
코드:
import java.lang.reflect.Method; import java.lang.reflect.Field; class Test { private String s; public Test() { s = "Java Testing Methods"; } public void method1() { System.out.println("The string is " + s); } public void method2(int n) { System.out.println("The number is " + n); } private void method3() { System.out.println("Private method invoked"); } } class Reflect { public static void main(String args[]) throws Exception { Test obj = new Test(); Class cls = obj.getClass(); System.out.println("The name of class is " + cls.getName()); System.out.println("The public methods of class are : "); Method[] methods = cls.getMethods(); for (Method method:methods) System.out.println(method.getName()); Method methodcall1 = cls.getDeclaredMethod("method2", int.class); methodcall1.invoke(obj, 19); Field field = cls.getDeclaredField("s"); field.setAccessible(true); field.set(obj, "JAVA"); Method methodcall2 = cls.getDeclaredMethod("method1"); methodcall2.invoke(obj); Method methodcall3 = cls.getDeclaredMethod("method3"); methodcall3.setAccessible(true); methodcall3.invoke(obj); } }
출력:
위의 Java 프로그램에서는 먼저 java.lang 패키지를 가져온 다음 클래스에 전용 필드를 생성해야 하며 생성자도 생성됩니다. method1()은 인수가 없는 공개 메소드로 취해진 다음, 공개 메소드이지만 정수 인수가 있는 메소드 2()를 생성했으며 비공개 메소드 method3은 취소되었으며 Reflect 클래스에서 호출된 위의 세 메소드와 출력은 위에 나와 있습니다. 스크린샷.
이 글에서는 프라이빗 메서드를 직접 테스트해서는 안 되며, 해당 메서드를 호출하는 퍼블릭 메서드에 미치는 영향만 테스트해야 한다는 결론을 내렸습니다. 또한 테스트는 클래스의 공개 인터페이스에만 액세스해야 한다는 결론을 얻었습니다. 비공개 메서드를 테스트하는 경우 반영 코드를 비공개 정적 클래스에 배열합니다.
위 내용은 Java 테스트 개인 메소드의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!