У меня есть следующий модульный тест:
@Test
public void TestPrivateMethodDelegation() throws InstantiationException, IllegalAccessException, IllegalArgumentException,
InvocationTargetException, NoSuchMethodException, SecurityException
{
Foo foo = new ByteBuddy()
.subclass(Foo.class)
.method(named("getHello")
.and(isDeclaredBy(Foo.class)
.and(returns(String.class))))
.intercept(MethodDelegation.to(new Bar()))
.make()
.load(Foo.class.getClassLoader(), ClassReloadingStrategy.fromInstalledAgent())
.getLoaded()
.getDeclaredConstructor().newInstance();
Method privateMethod = Foo.class.getDeclaredMethod("getHello");
privateMethod.setAccessible(true);
assertEquals(privateMethod.invoke(foo), new Bar().getHello());
}
Вот классы, которые он использует:
@NoArgsConstructor
public class Foo
{
@SuppressWarnings("unused")
private String getHello()
{
return "Hello Byte Buddy!";
}
}
@NoArgsConstructor
public class Bar
{
public String getHello()
{
return "Hello Hacked Byte Buddy!";
}
}
Когда я делаю метод getHello () общедоступным в классе Foo, этотест проходит.Когда я оставляю его закрытым, тест не проходит, поскольку я могу только предположить, что закрытый метод не делегирован должным образом.
Возможно ли даже делегировать закрытый метод другому классу?
Спасибо!