Я пытаюсь создать издевательскую структуру в java, которая соответствует конкретному требованию проекта.Замена вызова метода java из поля вызовом метода
Сценарий, у меня есть метод
public String returnRandom(){
String randomString = this.randomGenerator.returnRandom()
}
randomGenerator является зависимость этого класса и вводится в объект только во время выполнения. Означает, что это будет null, если объект создан без рамки внедрения зависимостей.
Во время испытания изоляции, я хочу, чтобы заменить задание на заявление
this.randomGenerator.returnRandom();
с помощью метода, который возвращает бездомную случайное значение, скажем, «HelloWorld».
Я пытался использовать javassist.expr.FieldAccess для того же самого, используя который я могу заменить поле без операции и вызов метода можно изменить с помощью javassist.expr.MethodCall.
Я не могу понять, как заменить поле манекеном или нет операции. Возможно ли это с помощью java assist или я должен использовать для управления более низким уровнем байт-кода, например asm?
Примечание: Я мог бы заменить замену вызова метода, который не возникает в поле, используя javassist.expr.MethodCall. Например, если в приведенном выше примере является
public String returnRandom(){
String randomString = returnRandom();
}
Я могу заменить, как
public String returnRandom(){
String randomString = MockedString.getSampleRandom();
}
Есть два вопроса, которые приходят, когда насмешливые, 1), описывающее поведение фиктивных объектов, 2) впрыскивать фиктивные объекты. (1) по своей сути не является тощим, потому что у вас могут быть разные типы поведения, которые необходимо протестировать. Хорошая модульная тестовая установка имеет хорошие значения по умолчанию для макетных объектов и вводит их. Единичные тесты дальше вниз могут получить доступ к этим макетным объектам, чтобы изменить их поведение. Вы хотите внедрить ложные объекты и уже удовлетворены вашим системным методом создания и описания макетных объектов? –
Точно, наша целевая системная архитектура и процесс выравниваются таким образом, что для большинства объектов мы знаем их значения по умолчанию (активность, выполняемая на самой стадии проектирования). Тогда задача состоит в том, чтобы определить тесты. Мы пытаемся упростить определение теста с закрытой структурой, а не с очень открытыми тестовыми примерами стиля junit и эмпирическими механизмами, такими как все пары. И, выполняя эти определения тестов, мы пытались манипулировать байтовым кодом (или исходным кодом) для ввода этих макетных объектов. – arunvg
Чтобы управлять байтовым кодом, это можно сделать во время выполнения? У меня создалось впечатление, что это невозможно. Это было бы опасно, потому что, если есть сотни тестов, перекомпиляция для каждого теста может привести к длительному циклу тестирования. –