Модульное тестирование класса с частными переменными среды
У меня есть EJB, который я хочу протестировать его общедоступными методами. Я тестирую EJB как ПОЖО. Так что я просто создал его и вызвал публичный метод.
Проблема в том, что публичный метод устанавливает некоторые свойства среды Glassfish, а переменная окружения является приватной. Поэтому я не могу установить его вне класса, и когда я просто вызываю этот открытый метод для объекта среды, он генерирует исключение nullPointerException.
Класс, который я хочу проверить, имеет,
@Resource(name="NameServiceEnvironment")
private Properties nameServiceEnvironment;
public void setup() {
// Set the environment.
Properties environment = new Properties();
environment.setProperty("name.host", this.nameServiceEnvironment.getProperty(NAME_HOST));
environment.setProperty("name.port", this.nameServiceEnvironment.getProperty(NAME_PORT));
...}
Так что теперь для nameServiceEnvironment он генерирует исключение нулевого указателя.
Теперь из тестового класса я только что создал экземпляр вышеупомянутого класса и вызвал метод установки.
Благодарю.
4 ответа
У вас всегда есть доступ, даже к частным методам. Используйте отражение в своем тесте, чтобы получить доступ к закрытым свойствам - установите их и продолжайте.
Добавить сеттер для nameServiceEnvironment
и ввести свой собственный nameServiceEnvironment
когда юнит тестирование.
Обновление на основе комментария
или вы можете извлечь бит свойств из установки в другой метод и переопределить его в своем тесте для обмана.
public void setup() {
setupEnvironment();
...
}
void setupEnvironment(){ //you would override this in your unit test
Properties environment = new Properties();
environment.setProperty("name.host", this.nameServiceEnvironment.getProperty(NAME_HOST));
environment.setProperty("name.port", this.nameServiceEnvironment.getProperty(NAME_PORT));
}
Ну, не совсем подделка. Вы просто пропустите этот бит в своем тесте.
Ваше nameServiceEnvironment устанавливается с помощью
@Resource(name="NameServiceEnvironment")
поэтому вам просто нужно убедиться, что в вашей тестовой среде настроен этот ресурс (как в вашей среде Glassfish). Вы можете использовать Spring, например.
Это потому, что nameServiceEnvironment не вводится? Это было одной из причин, по которой Аркиллиан стал популярным. Я использовал его в течение нескольких месяцев для модульного тестирования ejb в контейнере, но его было нелегко использовать (по крайней мере, для меня). Используя arquillian, вы можете выполнить все внедрения зависимостей, а затем выполнить методы тестирования. Я также использовал отражение как другой предложенный. И в зависимости от того, какую платформу DI вы используете, вы, вероятно, можете настроить ее для тестирования, чтобы внедрить ее.
код отражения, если вы хотите сделать это:
public class ATest {
@Test
public void testEjb() throws Exception {
MyEJB myEjb = new MyEJB();
Class<? extends MyEJB> cls = myEjb.getClass();
Field field = cls.getDeclaredField("props");
field.setAccessible(true);
field.set(myEjb, new Properties());
myEjb.somePublicMethod();
}
class MyEJB {
private Properties props;
public void somePublicMethod() {
System.out.println("props has: " + props);
}
}
}