アサーション時、 ListのtoString()がObjectのtoString()っぽくなる

Listのアサーションを記述したとき、

java.lang.AssertionError: 
Expected: is <[1]>
     but: was <java.util.ArrayList@35ffcd64>

の様にObjectのtoString()っぽい表記になることがあった. 原因は toString() 内部で NullPointerException が発生していたこと. この時、org.hamcrest.BaseDiscriptionの以下のコードにたどり着いてフォーマットされる. ObjectのtoString()ではなかった.

    private String descriptionOf(Object value) {
        try {
            return valueOf(value);
        }
        catch (Exception e) {
            return value.getClass().getName() + "@" + Integer.toHexString(value.hashCode());
        }
    }

以下再現コード. テスト対象.

public class Library {

    private Integer integer_;

    Library(Integer integer) {
        integer_ = integer;
    }

    public String toString() {
        return integer_.toString();
    }
}

テストコード.

import java.util.*;
import org.junit.Test;
import static org.junit.Assert.*;
import static org.hamcrest.CoreMatchers.*;

public class LibraryTest {
    @Test public void testSomeLibraryMethod() {
        Library classUnderTest = new Library(null);
        List<Library> list = new ArrayList();
        list.add(classUnderTest);

        assertThat(list, is(Arrays.asList(new Library(1))));
    }
}

結果は冒頭のとおり.