Вы пытаетесь провести модульное тестирование этого кода и получить ответ, не заботясь об условиях? Если это так, то вы ищете "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());
}