2016-07-12 3 views
2

Я пытаюсь проверить класс, который я написал, и который реализует карту с Java, используя Guava-testlib MapInterfaceTest. Когда я пытаюсь запустить свой MapTest, который реализует MapInterfaceTest, все тесты терпят неудачу (почти, 52/56), хотя все, что я сделал, это вызвать функции от LinkedHashMap.Как использовать Guava MapInterfaceTest для тестирования вашего класса

Почему это происходит? Как работает проверка интерфейса guava и как я могу исправить свой код? Отладчик здесь действительно не помогает.

К примеру, у меня есть:

public void testEqualsForEmptyMap() { 
     final Map<K, V> map; 
     try { 
      map = makeEmptyMap(); 
     } catch (UnsupportedOperationException e) { 
      return; 
     } 

     assertEquals(map, map); 
     assertEquals(makeEmptyMap(), map); 
     assertEquals(Collections.emptyMap(), map); 
     assertFalse(map.equals(Collections.emptySet())); 
     //noinspection ObjectEqualsNull 
     assertFalse(map.equals(null)); 
    } 

Мой метод makeEmptyMap:

@Override 
    protected Map<Integer, String> makeEmptyMap() throws UnsupportedOperationException { 
     return new MyMap<Integer, String>(); 
    } 

Моя карта:

private final HashMap<K, V> entries; 

public MyMap() { 
    entries = new LinkedHashMap<K, V>(); 
} 

Этот тест не здесь: assertEquals(makeEmptyMap(), map);

+1

Вам нужно показать код и тестовый код, потому что в противном случае недостаточно увидеть, почему и почему тесты терпят неудачу. – pinturic

+0

MapInterfaceTest больше не используется нами; мы почти полностью используем MapTestSuiteBuilder. –

ответ

3

Considerin g код, видимый в вашем классе MyMap, сбой вполне нормальный: поскольку вы не переопределили метод Object#equals, вы используете реализацию по умолчанию, которая основана на равенстве ссылок в памяти (Object#equals реализована с использованием ==).

Как следствие, JVM пытается проверить, являются ли оба объекта одним и тем же экземпляром в памяти, а какие нет. И ваш тест терпит неудачу.

В более общем примечании вам необходимо реализовать полный интерфейс Map, используя, иногда, нетривиальный код. Поэтому, если вы точно не знаете, что вы делаете, и почему вы это делаете, предпочитайте повторно использовать существующую реализацию Карты.

+0

Вы правы. Я отсутствовал равным и hashCode. После того, как я сгенерировал эти 2 метода, все мои тесты прошли – Mocktheduck

+1

Если вы хотите только переопределить некоторые методы и делегировать все остальное в существующую реализацию «Map», подумайте об использовании ['ForwardingMap'] (https://google.github.io /guava/releases/19.0/api/docs/index.html?com/google/common/collect/ForwardingMap.html). –