Я бы хотел, чтобы тестовый класс JUnit 4 реализовал тот же интерфейс, что и класс его тестирования. Таким образом, по мере изменения интерфейса (и он будет, мы будем в раннем развитии) компилятор гарантирует, что соответствующие методы добавляются в тестовый класс. Например:Методы непустых тестов в JUnit 4
public interface Service {
public String getFoo();
public String getBar();
}
public class ServiceImpl implements Service {
@Override public String getFoo() { return "FOO"; }
@Override public String getBar() { return "BAR"; }
}
public class ServiceTest implements Service {
@Override
@Test
public String getFoo() {
//test stuff
}
@Override
@Test
public String getBar() {
//test stuff
}
}
Когда я пытаюсь это, я получаю сообщение об ошибке: «java.lang.Exception: Метод getFoo() должен быть недействительным», предположительно потому, что методы испытаний должны возвращать ничтожным. Кто-нибудь знает об этом?
Как бы принудительно реализовать этот метод через гарантию интерфейса каким-либо образом его тестируют? Поскольку вы пытаетесь использовать компилятор, чтобы гарантировать покрытие теста, так сказать ... Но отдельный экземпляр из класса производственного класса, реализующего один и тот же интерфейс, не гарантирует проверку. Это гарантирует соблюдение интерфейса. –
Ну, правда, это гарантирует, что метод был добавлен в тестовый класс для каждого метода службы. Это не гарантирует, что метод действительно проверяет что-либо. Честно говоря, ни один из инструментов покрытия кода не имеет, так как вы можете использовать весь код и ничего не утверждать. Я просто хочу предупредить разработчика (разработчиков) о том, что есть замечательные тесты для рассмотрения. – romacafe
Посмотрите на PMD http://pmd.sourceforge.net/rules/junit.html, в частности, правило JUnitTestsShouldIncludeAssert. – TofuBeer