Hamcrest 총괄

7256 단어 Java
Junit
JUnit 프레임 워 크 는 자주 사용 하 는 단언 들 을 assert 방법 으로 봉 했다.이 assert 방법 들 은 단원 테스트 의 작성 을 간소화 하 는 데 도움 을 줄 수 있다.이렇게 되면 Junit 는 이러한 단언 에 따라 Assertion Failed Error 오 류 를 던 졌 는 지 여부 에 따라 테스트 용례 의 실행 결 과 를 판단 할 수 있다. 
Hamcrest
Junit 를 사용 한 경험 이 있 을 것 입 니 다.실제 개발 에서 eqaul,null,true 와 같은 기본 적 인 단언 들 은 가 독성 이 좋 지 않 습 니 다.그리고 우 리 는 대상,집합,맵 등 데이터 구 조 를 비교 해 야 할 때 가 많다.이렇게 하면 우 리 는 큰 필드 를 가 져 와 서 단언 을 하든지 한다.아니면 아예 표현 식 을 만들어 결 과 를 단언 하 세 요.JUnit 4.4 는 Hamcrest 프레임 워 크 를 도 입 했 고 Hamcest 는 일치 문자 Matcher 를 제공 했다.이런 일치 부 호 는 자연 언어 에 더욱 가 깝 고 가 독성 이 높 으 며 유연 하 다.Hamcrest 는'매 칭 기'라 고 불 리 는 방법 을 대량으로 제공 했다.그 중에서 모든 매 칭 기 는 특정한 비교 작업 을 수행 하 는 데 사용 하도록 설계 되 었 다.Hamcrest 는 사용자 정의 일치 기 를 만 들 수 있 도록 확장 성 이 좋 습 니 다.무엇 보다 JUnit 에 도 Hamcrest 의 핵심 이 포 함 돼 Hamcrest 를 직접 사용 할 수 있 는 네 이 티 브 지원 을 제공 했다.당연히 기능 이 완 비 된 Hamcrest 를 사용 해 야 하 며,그것 에 대한 의존 도 를 도입 해 야 한다. 
예 를 들 어 전 자 는 Junit 의 단언 을 사용 하고 후 자 는 Hamcrest 의 단언 을 사용한다.
 

    @Test
    public void test_with_junit_assert() {
        int expected = 51;
        int actual = 51;

        assertEquals("failure - They are not same!", expected, actual);
    }

    @Test
    public void test_with_hamcrest_assertThat() {
        int expected = 51;
        int actual = 51;

        assertThat("failure - They are not same!", actual, equalTo(expected));
    }


1. 。 expected actual 。
2. Hamcrest 。 。
,Junit , , 。
Hamcrest 。

 

 

Hamcrest , http://hamcrest.org/
Java
Python
Ruby
Objective-C
PHP
Erlang
Swift

 

 

Hamcrest

Hamcrest api 。

 

 


  :
    anything -     ,                   
    describedAs -               
    is -          -    “Sugar”
  :
    allOf -              , Java  &&
    anyOf -             , Java  ||
    not -                ,    
  :
    equalTo -         Object.equals  
    hasToString -   Object.toString  
    instanceOf, isCompatibleType -     
    notNullValue, nullValue -   null
    sameInstance -       
Beans:
    hasProperty -   JavaBeans  
  :
    array -         test an array’s elements against an array of matchers
    hasEntry, hasKey, hasValue -     Map      ,    
    hasItem, hasItems -             
    hasItemInArray -             
  :
    closeTo -            
    greaterThan, greaterThanOrEqualTo, lessThan, lessThanOrEqualTo -     
  :
    equalToIgnoringCase -             
    equalToIgnoringWhiteSpace -          
    containsString, endsWith, startsWith -        

API 。 , 、 、 。
 

 

, 。 Hamcrest api , 。

 

hasProperty

 


public class MyPerson {
    private Address address;
    private String name;
    private String fullName;

    // ...
}

 

Address :

 


public class Address {

    private String companyAddress;
    private String personalAddress;

    // ...
}

person , companyAddress 。

 

 


    @Test
    public void test_with_complex_property() {
        MyPerson p = new MyPerson();
        Address address = new Address();
        address.setCompanyAddress("");
        p.setAddress(address);
        assertThat("failure has no address property !", p, hasProperty("address"));

        // would failed
        // assertThat("failure has no address.companyAddress !", p, hasProperty("address.companyAddress"));
    }

。 hasProperty , 。  rest-assured API 。

 

 


assertThat("failure has no address property !", p, hasProperty("address", hasProperty("companyAddress")));

, 。

 

 

, :

 


    @Test
    public void test_with_list_generics() {
        List persons = new ArrayList();
        MyPerson p = new MyPerson();
        p.setName("KaKa");
        persons.add(p);

        MyPerson p2 = new MyPerson();
        p2.setName("Hust");
        persons.add(p2);

        // compile error
        // assertThat("failure has no address property !", persons, everyItem(hasProperty("address")));
        assertThat("failure has no address property !", (List)persons, everyItem(hasProperty("address")));
    }

。 , ! , 。

 

, person name fullName ,  fullName  startwith name


    @Test
    public void test_with_list_compare_with_self() {
        //      
        List persons = new ArrayList();
        MyPerson p = new MyPerson();
        p.setName("KaKa");
        p.setFullName("KaKa Zhang");
        persons.add(p);

        MyPerson p2 = new MyPerson();
        p2.setName("Hust");
        p.setFullName("Hust Zhang");
        persons.add(p2);

        //      , person      startsWith      
        assertThat((List)persons, everyItem(hasProperty("name", startsWith(""))));
    }

, startwWith 。

 

 


    @Test
    public void test_with_list_compare_with_self() {
        //      
        List persons = new ArrayList();
        MyPerson p = new MyPerson();
        p.setName("KaKa");
        p.setFullName("KaKa Zhang");
        persons.add(p);

        MyPerson p2 = new MyPerson();
        p2.setName("Hust");
        p2.setFullName("Hust Zhang");
        persons.add(p2);

        //        
        for (MyPerson person : persons) {
            assertThat(person.getFullName().startsWith(""), is(true));
        }
    }

。 , 。
 

 




 


 

 

 


 


 

 

 

 

좋은 웹페이지 즐겨찾기