Измените байт-код, чтобы метод возвращал значение true - PullRequest
1 голос
/ 29 мая 2011

У меня в файле классов есть метод, подобный следующему:

public boolean validate(String str) {}

В этом методе validate много кодов, но я только хочу, чтобы он всегда возвращал true или false.Может кто-нибудь указать мне, как изменить файл класса для достижения этой цели?

Ответы [ 4 ]

5 голосов
/ 30 мая 2011

RULE override rtn КЛАСС ФУ СПОСОБ валидации Если правда ВЕРНУТЬ верный ENDRULE

http://www.jboss.org/byteman

2 голосов
/ 29 мая 2011

Вы пытаетесь провести модульное тестирование этого кода и получить ответ, не заботясь об условиях? Если это так, то вы ищете "Mocking" фреймворки. В Java я могу думать о Mockito и EasyMock от макушки головы.

Соответственно, вы можете использовать PowerMock (работает в тандеме с любой из вышеперечисленных платформ Mocking) для динамического изменения классов (таких как final классы / методы, static методы и даже private куски занятий). PowerMock на самом деле может изменить байтовый код при необходимости. Проверьте под его папками загрузки классов.

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

По крайней мере, вы, вероятно, можете просмотреть PowerMockito, чтобы увидеть, как они меняют байт-код.

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

public class SomeClass {
    public boolean validate(String s) {
        // tons of logic
    }
}

Тест (с использованием Mockito с JUnit 4 (пропустите атрибут @Test для JUnit 3)):

private final MyClassBeingTested testClass = new MyClassBeingTested();

@Test
public void testMyCodeWithSomeClass() {
    SomeClass some = mock(SomeClass.class);

    when(some.validate(anyString())).thenReturn(eq(true));

    // whenever it uses "some.validate()", with any
    //  string, then it will return true
    testClass.useSomeClass(some);

    // assert whatever conditions you want

    // if you care to ensure that it called validate:
    //  note: times(1) is implied if not supplied, but times(0), times(2), etc.
    //  could be used ("never()" exists as a synonym for times(0))
    verify(some, times(1)).validate(anyString());
}
1 голос
/ 29 мая 2011

Самый простой способ изменить байтовый код - декомпилировать класс или получить копию исходного кода. Измените код и скомпилируйте его. Поместите новую версию ранее в classpath или замените оригинал в банке. Таким образом, вы изменили метод.

Вы можете изменить его во время выполнения, но это в 100 раз сложнее. ;)

1 голос
/ 29 мая 2011

Может возвращать только true или false, согласно предоставленной сигнатуре метода.
Можете ли вы создать класс-оболочку, который делегирует вызовы оригиналу и переопределяет требуемое поведение вместо того, чтобы пытаться манипулировать байт-кодом?

...