2017-02-15 21 views
2

Я читаю книгу Effective Jave, в Item 13: Minimize the accessibility of classes and members, он отметил, что:Как мы можем протестировать пакет-частный класс?

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

Я знаю, что мы должны инкапсулировать пользователь, сокрытие информации от клиентов, мы можем проверить их, обращаясь к классу с сеттерами и добытчиками, но Как я должен понимать сделать класс частного пакет доступны, если так Как проверить ?

ответ

1

Я думаю, что автор имеет в виду, что вместо

package my.package; 

class TestableClass { 
    private String property; 
} 

Вы можете изменить видимость

package my.package; 

class TestableClass { 
    String property; 
} 

Со второй реализации вы можете получить доступ к свойству из теста в пакете my.package например

package my.package; 

class TestableClassTest { 
    // ... 
} 

В то же время подкласс не может доступ к собственности - это пособие, объединенное с protected.

+0

Michael, спасибо за ваш ответ. Я подумал об этом, но не всегда удобно запускать все тесты. К сожалению, невозможно разделить файлы тестовых классов на другой пакет. +1 для вас – haifzhan

1

В основном это означает, что ваш класс тестера должен находиться в том же пакете, что и ваш испытанный класс. Это позволит вашему тестированному классу и всем членам и методам, защищенным пакетом, доступным для вашего класса тестирования. Классы могут быть расположены под разными корнями: ваш испытанный класс может находиться под src/myrootpackage.first.second.MyClass, а ваш класс тестирования может находиться под test/myrootpackage.first.second.MyClass.Tester

+0

это имеет смысл и probbabliy это единственный способ сделать тест на пакет-частные классы. благодаря! +1 – haifzhan

+0

Моя текущая настройка соответствует 'src.main.java.myrootpackage.first.MyClass.java' и' src.test.java.myrootpackage.first.test.MyClassTest.java', но тестовый класс не может найти исходный класс. Если я удалю 'test' и поставлю тестовый пример под' src.test.java.myrootpackage.first.MyClassTest.java', то он будет работать. –

+0

Вы правы, если ваш метод, который вы хотите протестировать, определяется как защищенный (или закрытый пакет i.e. нет), тогда ваш тестовый класс должен быть в одном пакете. в ваших настройках часть пути «src.main.java» и «src.test.java» не входит в пакет. Итак, у вас был ваш класс в пакете «myrootpackage.first» и ваш тестовый класс в «myrootpackage.first.test». После того как вы переместили свой тестовый класс в «myrootpackage.first», он видит защищенных или пакетных частных членов вашего класса. Также вы можете увидеть пакет в первой строке вашего класса «package myrootpackage.first» –