Убедитесь, что все методы получения были вызваны в тесте JUnit - PullRequest
2 голосов
/ 01 апреля 2010

У меня есть класс, который использует XStream и используется в качестве формата передачи для моего приложения. Я пишу тесты для других классов, которые отображают этот формат передачи в другой стандарт обмена сообщениями. Я хотел бы убедиться, что все получатели в моем классе вызываются в тесте, чтобы гарантировать, что, если новое поле добавлено, мой тест правильно проверяет его.

Грубый контур класса XStream

@XStreamAlias("thing")
public class Thing implements Serializable {
 private int id;
 private int someField;

 public int getId(){ ... }
 public int someField() { ... }
}

Так что теперь, если я обновлю этот класс так:

@XStreamAlias("thing")
public class Thing implements Serializable {
 private int id;
 private int someField;
 private String newField;

 public int getId(){ ... }
 public int getSomeField() { ... }
 public String getNewField(){ ... }
}

Я бы хотел, чтобы мой тест не прошел, потому что старые тесты не вызывают getNewField().

Цель состоит в том, чтобы при добавлении новых получателей у нас был какой-то способ убедиться, что тесты их проверят.

В идеале это должно содержаться целиком в тесте и не требует изменения базового класса Thing.

Есть идеи? Спасибо за внимание!

Ответы [ 6 ]

5 голосов
/ 01 апреля 2010

Может быть, инструменты покрытия кода - это то, что вам нужно. Если у вас 100% покрытие кода, были вызваны все методы get. Если вы используете eclipse, проверьте плагин EclEmma.

0 голосов
/ 02 марта 2013

Я написал такую ​​вещь, вы можете найти ее здесь . Это делает прокси объекта, так что все вызовы будут перехвачены и позже могут быть проверены.

0 голосов
/ 02 апреля 2010

Рассмотрим Java Bean Tester: http://sourceforge.net/projects/javabeantester/

Мы используем это очень часто. И нам это нравится.

0 голосов
/ 01 апреля 2010

Похоже, вы говорите о мета-тесте - тесте теста. ИМХО, это не имеет большого смысла. Тест - это спецификация. Поэтому разработчик тестового примера должен обновлять тест при добавлении новых полей. Тем не менее, вот гетто способ вызвать все методы получения Java-бина.

public class GhettoBeanTest {
    private static class Subclass extends SomeObject {
        @Override public String toString() {
            return org.apache.commons.lang.builder.ToStringBuilder.reflectionToString(this);
        }
    }

    @Test public void ensureToStringMethodExecutes() {
        String value = new Subclass().toString();

        // teset passed - all getter methods were executed by the toString method above
    }
}
0 голосов
/ 01 апреля 2010

Если вы хотите проверить свои тесты автоматически, то JUnit не является хорошим вариантом. Как бы вы хотели, чтобы ваш «специальный тест» вызывался всегда как последний после всех других тестов? (Я не говорю, что это невозможно, но это противоречит модели / философии JUnit, в которых говорится, что контрольные примеры должны быть независимы друг от друга).

Если по какой-либо причине вы решите сделать это, одна из возможностей - это создать отчет о покрытии кода Cobertura и проанализировать его, чтобы определить, были ли охвачены все геттеры во время испытаний. Возможно, есть способ связать Cobertura с помощью некоторого API вместо зависимости от выходных файлов отчетов.

Пример алгоритма:

  1. запустить обычный набор тестов
  2. запустить Кобертура
  3. запустить специальный контрольный пример
0 голосов
/ 01 апреля 2010

Вы можете использовать Сонар . Я нахожу это очень полезным и простым в настройке. Также легко интегрировать с Hudson. У них также есть плагин Eclipse .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...