Во-первых, класс StudentInfoService
в вашем примере не поддается тестированию или, по крайней мере, не так просто.Это по очень простой причине - невозможно передать объект соединения с базой данных классу, по крайней мере, не в том методе, который вы перечислили.
Чтобы сделать класс тестируемым, потребуется сборкаВаш класс следующим образом:
public class StudentInfoService
{
private Connection conn;
public StudentInfoService(Connection conn)
{
this.conn = conn;
}
public StudentInfo getStudentInfo(long studentId) {
//Uses the conn object to communicate with DB and creates
// StudentInfo object with necessary information
// and returns it to the caller.
}
}
Приведенный выше код позволяет вводить зависимости через конструктор.Вы можете использовать инъекцию сеттера вместо инжектора конструктора, если это более подходит, но обычно это не для классов DAO / Repository, так как класс нельзя считать полностью сформированным без соединения.
Внедрение зависимостей будетПозвольте вашим тестовым сценариям создать соединение с базой данных (которая является соавтором для вашего класса / тестируемой системы) вместо того, чтобы заставить сам класс / систему создавать объекты соавтора.Проще говоря, вы отделяете механизм установления соединений с базой данных от вашего класса.Если ваш класс ранее просматривал источник данных JNDI, а затем создавал соединение, то это было бы непроверенным, если бы вы не развернули его в контейнере, используя Apache Cactus или подобную инфраструктуру, такую как Arquillian или если вы использовали встроенный контейнер.Изолировав задачу создания соединения от класса, вы теперь можете свободно создавать соединения в своих модульных тестах вне класса и предоставлять их классу по мере необходимости, что позволяет запускать тесты в среде Java SE.
Это позволит вам использовать ориентированную на базу данных инфраструктуру модульного тестирования, такую как DbUnit , которая позволит вам настроить базу данных в известном состоянии перед каждым тестом, а затем передать соединениеStudentInfoService
класса, а затем утверждают состояние класса (а также коллаборатора, то есть базы данных) после теста.
Следует подчеркнуть, что когда вы тестируете свои классы модульно, только ваши классы должныбыть единственными тестируемыми системами.Такие объекты, как соединения и источники данных, являются просто соавторами, которые можно и нужно высмеивать.Некоторые модульные тесты используют базы данных в памяти, такие как H2 , HSQL или Derby для модульных тестов, и используют производственные установки баз данных для интеграции ифункциональное тестирование.