Получение полного покрытия ветки в методе equals () с помощью EclEmma - PullRequest
0 голосов
/ 30 мая 2020

Это утомительно, но у меня есть задание, в котором мне нужно полностью охватить метод equals (), чтобы заработать все возможные баллы. У меня возникают проблемы с получением полного покрытия операторов / веток из-за части getClass () метода equals (). Пока что покрыто 1/2 ветки, но я не могу понять, как добраться до второй.

Метод Equals ниже:

public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (getClass() != obj.getClass())
            return false;
        //Lots of other tests checking the functionality of the program that I've figured out already
        return true;
    }

Модульный тест это покрывает мне половину ветки:

assertFalse(!s1.getClass().equals(s1.getClass()));

Поскольку я покрыл половину ветки, я предполагаю, что второе возможно. Но идк.

Спасибо

Ответы [ 2 ]

0 голосов
/ 30 мая 2020

Некоторая информация, которую вы упустили, - это то, к какому классу относится объект «s1» и к какому классу принадлежит этот метод equals. Разумно предположить, что «s1» имеет тот же тип, что и класс вашего метода «equals» определяется в.

Согласно этому предположению, рассматриваемая строка (преобразованная в более простую версию, указанную @howlger):

assertTrue(s1.getClass().equals(s1.getClass()));

Даже не выполняет ваш метод «равно». Это потому, что вы вызываете «s1.getClass (). Equals (...)» вместо «s1.equals (...)».

Утверждение, которое фактически проверяет ваш код, будет примерно так:

assertTrue(s1.equals(s1));

Чтобы ответить на ваш вопрос о покрытии, очевидно, что это само по себе не даст вам полного покрытия в методе. Он будет соответствовать первому «if» и вернет истину.

Утверждения, которые должны приблизить вас к полному охвату, будут включать следующие:

// s1 and s2 are different instances of the same class, with identical contents
assertTrue(s1.equals(s2));
// s1 and s2 are different instances of the same class, with different contents
assertFalse(s1.equals(s2));
// s1 and s2 are different instances of different classes
assertFalse(s1.equals(s2));

Кроме того, полезно отметить, что вы можете запустите свой тест в отладчике с точками останова в методе «равно», чтобы точно проверить, какой путь принимает код.

0 голосов
/ 30 мая 2020

if (getClass() != obj.getClass()) return false; считает два экземпляра разными, если оба не являются экземплярами одного и того же класса . Например, когда obj является экземпляром класса, который расширяет класс this, даже если все поля имеют одинаковое значение.

Таким образом, вам также нужно сравнить s1 с s2, то есть экземпляр класса, который расширяет класс s1, чтобы получить здесь выполненную ветвь return false;.

Обратите внимание, что в assertFalse(!s1.getClass().equals(s1.getClass())); ваш метод equals не вызывается, а java.lang.Class::equals и что assertFalse(!...) совпадает с assertTrue(...).

...