29
May
2006

Тестирование и внутренние классы (inner class)

Posted in: Тестирование кода, Java technologies, J2SE |

При тестировании отдельных классов Java-приложения, многие используют метод main или создают дополнительный тестовый класс. Отдельный класс луч?е использовать при интегральных тестах, а метод main после выпуска новой версии класса/пакета чаще всего нужно удалять.

В этой статье я вновь возвращаюсь к внутренним классам (inner class) для ре?ения описанной вы?е проблемы. На этот раз мы рассмотрим статические внутренние классы.
Статический внутренний класс описывается с модификатором static внутри декларации другого (обрамляющего) класса. Вот пример такого класса:

public class OuterClass {
    // ....
    public static class TestInnerClass {
        public static void main (String[] args) {
            // ....
        }
    }
}

?так, чем нам помогает данное описание при тестировании.
Во-первых, внутренний класс компилируется в отдельный class-файл. В приведенном примере после компиляции мы получим 2 класса: OuterClass.class и OuterClass$TestInnerClass.class. То есть, после окончания тестирования второй class-файл можно просто удалить. Преимущества очевидны, тесты и функционал находятся в одном source-файле.
Во-вторых, класс TestInnerClass имеет доступ ко всем private и protected методам обрамляющего класса. ?ными словами, мы обходим инкапсуляцию для более полного тестирования. Пользуйтесь этой возможностью осторожно.

Если вы знакомы с JUnit-тестированием, вам ничего не ме?ает писать тест-кейсы прямо во внутреннем классе.

Еще про внутренние классы в Java можно прочитать здесь - Внтуренние классы в Java.

Жду ва?их вопросов и комментариев.

5 Comments »

RSS feed for comments on this post. TrackBack URI



nitzshe
July 15, 2008 #

Если я не знаю как использовать JUnit, то использование для тестов внутренних классов неплохой выход, сам не додумался бы, спасибо.

Vitaliy
October 15, 2008 #

чувак, когда пи?е?ь статья, задумайся о том, что твои статья начинающие хакеры читают, а им надо по подробней расписывать…

Viking
January 31, 2009 #

Стоит также заметить, что static class TestInnerClass имеет доступ только к статическим методам OuterClass, сл-но при инстантиировании new OuterClass() на? внутренний класс не сможет достучаться до его нестатических методов

August 26, 2009 #

2 Viking: почему не сможет достучаться? Очень даже сможет… Вы наверное что-то напутали.

vrungel
March 7, 2010 #

позволю предположить, что Viking имел в виду некомпилируемость вот этого:

public class Outer {

void nonStatOuterMethod() {

}

static class StatInner {{
nonStatOuterMethod();
}}
}

но речь ?ла об этом


public class Outer {

void nonStatOuterMethod() {

}

static class StatInner {
public static void main(String[] args) {
Outer o = new Outer();
o.nonStatOuterMethod();
}
}
}

Leave a comment

XHTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <code> <em> <i> <strike> <strong> <pre>