Могу ли я «заменить» класс Java извне статического кода? - PullRequest
0 голосов
/ 07 мая 2018

У меня есть приложение, которое я хочу проверить:

import foo.ExtClass;
public class App {
  public static void main(String[] args) {
     ExtClass ext = new ExtClass();
     ...
  }
}

Я хочу написать модульный тест для этого приложения, однако я не хочу использовать foo.ExtClass, но использую другую ложную реализацию для класса.

Обычно я использовал бы фабрику для создания экземпляра класса в соответствии с некоторой конфигурацией, которой можно управлять в модульном тесте. Однако в этом случае Я не могу изменить протестированное приложение .

Я думал о том, чтобы написать собственный загрузчик классов для загрузки ложного класса вместо реального класса - не уверен, возможно ли это без каких-либо изменений в тестируемом приложении и как.

Ответы [ 2 ]

0 голосов
/ 09 мая 2018

Подход, который я наконец использовал: Создал отдельный проект с моей фиктивной реализацией foo.ExtClass, и юнит-тесты.

Таким образом, фиктивная реализация появилась в classpath перед реальной реализацией, а оригинальный (протестированный) проект остался нетронутым.

0 голосов
/ 07 мая 2018

В качестве опции вы можете использовать собственный загрузчик классов, который заменит ваш класс тестовым. Таким образом, в основном вместо загрузки ExtClass из пакета приложения ваш загрузчик классов будет загружать тот же класс из вашего пакета тестирования с фиктивной реализацией.

Вот пример:

Как заменить классы в запущенном приложении в Java?

Также есть очень полезное руководство: https://zeroturnaround.com/rebellabs/reloading-objects-classes-classloaders/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...