Модульное тестирование класса с частными переменными среды

У меня есть 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);
    }
}

}

Другие вопросы по тегам