자바 주석 및 단위 테스트

논평

자바 주석 절차, 다음과 같은 분야에서 주석의 주요 역할을 설명하는 데 사용 JDK1.5 이후에 나타나는 새로운 기능입니다 :

  1. 예를 들어 편집 검사, @Override
  2. 문서를 작성하는 것은, 자바 문서는 노트에 따라 해당 문서를 생성합니다
  3. 코드 분석, 댓글하여 코드 분석 [이용하여 반사]

같은 내장 주석 일반적인 JDK가있다 :

  1. 오버라이드 (override) : 주석이 재 작성의 부모 클래스인지 여부를 수정하는 방법을 확인
  2. Deprecatedd : 주석 내용이 오래된 것으로 표시됩니다
  3. SuppressWarnning : 경고를 억제 인자는 모두가 모든 경고를 억제 대표 통과

사용자 정의 주석

많은 수의 비록 JDK 노트 내장, 그러나 또한 프로그램의 준비 주석의 광범위한 사용에 대한 몇 가지 프레임 워크로, 큰 편의를 가져왔다 있도록 우리가, 주석을 사용자 정의 할 수 있습니다.

자바 어노테이션은 기본적으로 상속입니다 java.lang.annotation.Annotation인터페이스 인터페이스,하지만 당신은 단순히 키워드를 사용하는 경우 interface인터페이스를 정의하는, 여전히 단지 공통 인터페이스가 주석을 정의하는 키워드의 사용을 요구, 언급하지 @interface키워드가 기본적으로 표시됩니다 상속 된 Annotation인터페이스와 주석으로 인터페이스를 정의

주석 단지 기본 타입, 문자열, 열거 유형, 주석, 이러한 유형의 배열, 우리는 재산이라고이 메소드를 호출을 할 수 있습니다 이러한 방법의 값을 반환하는 방법을 정의 할 수 있습니다.

주석을 사용하는 경우 다음 사항을주의해야

  1. 사용자가 설정 한 디폴트 값이 될 수있는 기본 할당을 사용하지 않는 경우, 속성 할당 노트를 제공해야합니다
  2. 속성 목록은 하나 개의 속성 값을 명명하는 경우 할당시에 속성의 이름을 지정할 수 없습니다
  3. 복수의 속성을 사용하는 쉼표로 구분 된 값
  4. 어레이 속성 값을 사용하여 {}하나 개의 배열 속성 값이 때 반면, {}생략 될 수있다

위안 노트

위안 노트가 주석 주석을 설명하는 데 사용되는 자바 메타 데이터 주석은 다음과 같은 몇 가지를 제공합니다

목표

다음 설명 위치 작용할 수 주석, 소스 코드를 주석을 사용할 수있다, 즉 자바 코드 요소이다 :

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Target {
    ElementType[] value();
}

이 주석은, 다음 열거 된 유형은 여러 값을 사용할 수 있습니다 배열의 ElementType에 열거 형을 전달해야하는 속성 하나 개의 속성 값입니다

ElementType에 의미
유형 열거 유형을 사용 (댓글 포함) 인터페이스, 클래스,
(열거 상수 포함) 필드 선언
방법 방법
PARAMETER 매개 변수 선언
건설자 생성자
LOCAL_VARIABLE 지역 변수 선언
ANNOTATION_TYPE 주석 형 선언
꾸러미 패키지 선언
보유

유지 노트의 주석 형의 길이를 나타냅니다, 세 가지 주요 단계가 있습니다 : 소스 단계, 클래스 객체 단계, 운영 단계, 소스의 위상은 단지 소스 코드에 존재하는 클래스 객체 무대 수단은 .class 파일로 컴파일됩니다, 클래스 객체가 메모리에로드되는 구현 단계를 의미합니다. 기본 보존 정책 RetentionPolicy.CLASS을.

다음과 같이 소스 코드는 다음과 같습니다

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Retention {
    RetentionPolicy value();
}
문서화

그것은 주석 요소의 javadoc 같은 도구를 사용하여 문서화 할 수있다 있음을 나타냅니다. 소스는 다음과 같이 :

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Documented {
}
상속

그것은 주석 형이 자동적으로 상속되는 것을 나타냅니다

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Inherited {
}

읽기 내장 노트

내장 주석의 다음과 같은 해석은 JDK의 사용과 관련된 몇 가지주의 사항을 설명하기 위해

보수
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}

주석을 컴파일 검토 한 결과, 주석 여부 주석은 부모 클래스를 다시 작성하는 방법입니다.

보기의 소스 관점에서, 그것은 단지 방법에 사용 될 수 있으며, 그것은 단지의 .class 파일로 컴파일되지 않습니다 소스 단계에 존재

Deprecatedd
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE})
public @interface Deprecated {
}

컴파일러, 프로그램 구성 요소 (예를 들면, 등, 클래스, 메소드, 속성 등)를 알리는 데 사용 권장되지

보기의 소스 관점에서, 거의 자바 프로그램의 모든 요소를 ​​사용할 수 있으며, 메모리에로드됩니다

SuppressWarnning
@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
@Retention(RetentionPolicy.SOURCE)
public @interface SuppressWarnings {
    String[] value();
}

경고 특정 유형의 무시하도록 컴파일러에 지시합니다
다음과 같이 문자열 배열을 전달해야, 값은 다음과 같습니다
| 매개 변수 | 의미 |
--- | : | : | ---
오래된 클래스 나 메소드를 사용하여 | | 중단 경고 |
| 검사되지 않은 | | 때 체크되지 않은 변환 경고 수행
| 위해 fallthrough이 | | 스위치 블록이 방학 경고없이 다음 케이스에 들어갈 때
어떤 경로가 존재하지 않는 클래스 경로에서 소스 파일 경로, 그래서 거기 | | 경로를 경고 |
| 시리얼 | 경고 클래스의 순서를 정의 할 수 있습니다 serialVersionUID의 실종 |
| 마지막 | 경고 마지막 절은 정상적으로 완료 할 수 없습니다 |
| 모든 | 경고 위의 모든 경우 |

프로그램에서 주석을 구문 분석

일반적으로 반사 된 기술에 의해 정의 주석을 파싱 반사 기술에 의해 식별 될 주석을 필수 주석 범위 런타임 메모리에로드하게 될 것이다;

JDK는 우리의 사용을 촉진하기 위하여 다음과 같은 일반적인 API를 제공
| 방법 | | 해석의 반환 값을 |
----- | : --- | : ---- | |
| T | getAnnotation (클래스 annotationClass) |이 그 요소가있는 경우 주석의 타입을 지정하는, 해당 특수 효과가 null 반환 그렇지 반환 |
| 주석 [] | getAnnotations는 () | |이 요소에 존재하는 모든 주석 반환
| 주석 [] | getDeclaredAnnotations을 () |이 요소에 직접 존재하는 모든 주석을 반환 . |
| 부울 | isAnnotationPresent (클래스 annotationClass는 <는 주석을 확장?>) | 요소의 주석 존재의 유형을 지정하는 경우는 true를 반환하고, 그렇지 않은 경우는 false를 돌려 |

현실

완전한 사용자 정의 주석과 프로그램의 주석의 사용의 예를 설명하기 위해 다음 예제를 사용하여, 이제, MYTEST의 JUnit 주석을 모방하도록 규정 한 미래의 수정 방법이 자동으로 실행됩니다로 있다고 지적한다

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import java.lang.annotation.ElementType;

@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyTest {
}

먼저 댓글을 정의 음이 방법은 보유 노트가 실행 유지됩니다 표시 수정하여에만 사용할 수 있습니다 나타냅니다 수정하는 대상을 통해 수정이 주석 모든 방법의 구현에 대한 후속

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class Test {
    @MyTest
    public void test1(){
        System.out.println("this is test1");
    }

    @MyTest
    public void test2(){
        System.out.println("this is test2");
    }

    public static void main(String[] args) {
        Method[] methods = Test.class.getMethods();
        for (Method method:methods){
            if (method.isAnnotationPresent(MyTest.class)){
                try {
                    method.invoke(new Test());
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                } catch (InvocationTargetException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

우리는 두 가지 테스트 기능 테스트 클래스에서 사용되는 정의 @MyTest제 1 반사 방법에 의해 얻어지는 클래스의 모든 다음의 메소드를 호출 주요 공정에서 변형 isAnnotationPresent함수가 방법인지 여부를 확인 @Test변성, 만일 그렇다면, 상기 방법을 수행한다. 심지어이 추가 방법 후,만큼으로 @MyTest수정이 호출됩니다.

의 JUnit 프레임 워크

소프트웨어 단위 테스트의 품질을 보장하기 위해 소프트웨어 개발에 필수적인 부분은, 자바 단위 테스트의 JUnit 테스트 프레임 워크를 제공합니다

일반적으로 각 클래스에 해당하는 자바 프로그램은 예를 들어, Person 클래스는 Person 클래스를 테스트하기 위해 PersonTest을 테스트하는 클래스를 정의, 단위 테스트에 사용 된 모든 코드에 대한 테스트 클래스가 될 것입니다

의 JUnit은 우리가 단위 테스트를 작성하기 위해 노트의 숫자에 정의되어 있습니다

  1. @Test : 시험 방법, 주석 방법은 시험 방법 개질
  2. @Before : 테스트 메소드가 실행되기 이전의 주석은 변경 방법을 수행
  3. @After : 테스트 메소드가 실행 된 후에 주석이 수정 방법을 실행할

JUnit을 주석에 추가하여 테스트 주장을 자동화하는 기능의 수를 정의에서 다음과 같이 몇 가지 일반적이다 사용 :

  1. 보이드 assertEquals (부울 예상 부울 실제) 두 변수 또는 균형 방정식 여부 확인
  2. 무효 assertTrue (예상 부울, 부울 실제) : 상태를 확인 사실이다
  3. assertFalse (부울 조건을) 무효 : 체크 조건이 거짓
  4. assertNotNull (개체 개체) 무효 : 검사에서 개체가 비어 있지
  5. assertNull (개체 개체) 무효 : 검사 객체가 null
  6. 보이드 assertSame (부울 상태) assertSame () 메소드를 검사 관련된 두 물체가 동일한 객체를 가리
  7. 보이드 assertNotSame (부울 상태) assertNotSame () 메소드를 검사 관련된 두 물체가 동일한 객체를 가리키는 여부
  8. 보이드 assertArrayEquals (expectedArray, resultArray) assertArrayEquals () 메소드를 검사 2 개 개의 배열이 같은지

주장 이후이 기능은 테스트를 통과 할 수없는 이상을 확인하기 위해 후속만큼, 예외가 발생합니다 실패

산술 두 숫자를 수행하는 클래스 계산기를 정의한다고 가정

public class Calc {
    public int add(int a, int b){
        return a + b;
    }

    public int sub(int a, int b){
        return a - b;
    }

    public int mul(int a, int b){
        return a * b;
    }

    public float div(int a, int b){
        return a / b;
    }
}

이러한 방법이 올바른지 테스트하려면, 우리는 테스트 클래스를 정의

import org.junit.Test;
import static org.junit.Assert.assertEquals;
public class CalcTest {
    @Test
    public void addTest(){
        int result = new Calc().add(1,2);
        assertEquals(result, 3);
    }

    @Test
    public void subTest(){
        int result = new Calc().sub(1,2);
        assertEquals(result, -1);
    }

    @Test
    public void mulTest(){
        int result = new Calc().mul(1,2);
        assertEquals(result, 2);
    }

    @Test
    public void divTest(){
        float result = new Calc().div(1,2);
        assertEquals(result, 0.5, 0.001); //会报异常
    }
}

이상보고됩니다 발견 마지막 divTest 방법을 테스트 한 후 실제 값은 우리가 사용하기 때문에, 0 /예상 0.5 일치하지 않는 0이 얻을이 개 INT를 계산하는 데에만 예약 된 비트 정수를, 따라서 비정상적인보고됩니다


추천

출처www.cnblogs.com/lanuage/p/11441974.html