Wie erstelle ich einen Standardkonstruktor mit Byte Buddy

Ich möchte einige Methodenaufrufe für eine meiner Klassen abfangen, aber diese Klassen haben keinen Standardkonstruktor.

Wie würde ich Byte Buddy in der folgenden Klasse so einrichten, dass auch ein öffentlicher Konstruktor ohne Argumente erstellt wird, mit dem die generierte Klasse erstellt werden kann?

public class GetLoggedInUsersSaga extends AbstractSpaceSingleEventSaga {
    private final UserSessionRepository userSessionRepository;

    @Inject
    public GetLoggedInUsersSaga(final UserSessionRepository userSessionRepository) {
        this.userSessionRepository = userSessionRepository;
    }

    @StartsSaga
    public void handle(final GetLoggedInUsersRequest request) {
       // this is the method in want to intercept
    }
}

EDIT: Der konkrete Anwendungsfall hierfür ist die Vereinfachung der Einrichtung von Komponententests.
erzeit müssen wir immer so etwas schreiben:

@Test
public void someTest() {
   // Given

   // When
   GetLoggedInUsersRequest request = new GetLoggedInUsersRequest();
   setMessageForContext(request); // <-- always do this before calling handle
   sut.handle(request);

   // Then
}

Ich dachte, es wäre schön, einen Proxy in der @Before-Methode zu erstellen, der automatisch den Kontext für Sie einrichtet.

@Before
public void before()  {
    sut = new GetLoggedInUsersSaga(someDependency);
    sut = intercept(sut);
}

@Test
public void someTest() {
   // Given

   // When
   GetLoggedInUsersRequest request = new GetLoggedInUsersRequest();
   sut.handle(request);

   // Then
}

Ich habe ein bisschen rumgespielt, aber leider habe ich es nicht zum Laufen gebracht ..

public <SAGA extends Saga> SAGA intercept(final SAGA sagaUnderTest) throws NoSuchMethodException, IllegalAccessException, InstantiationException {
    return (SAGA) new ByteBuddy()
            .subclass(sagaUnderTest.getClass())
            .defineConstructor(Collections.<Class<?>>emptyList(), Visibility.PUBLIC)
            .intercept(MethodCall.invokeSuper())
            .method(ElementMatchers.isAnnotatedWith(StartsSaga.class))
            .intercept(
                    MethodDelegation.to(
                            new Object() {
                                @RuntimeType
                                public Object intercept(
                                        @SuperCall Callable<?> c,
                                        @Origin Method m,
                                        @AllArguments Object[] a) throws Exception {
                                    setMessageForContext((Message) a[0]);
                                    return c.call();
                                }
                            }))
            .make()
            .load(getClass().getClassLoader(), ClassLoadingStrategy.Default.WRAPPER)
            .getLoaded()
            .newInstance();
}

Leider bekomme ich jetzt (wahrscheinlich weil der ctor-aufruf noch nicht richtig eingerichtet ist)

java.lang.IllegalStateException: Cannot invoke public com.frequentis.ps.account.service.audit.GetLoggedInUsersSaga$ByteBuddy$zSZuwhtR() as a super method

Ist das überhaupt der richtige Ansatz?
Sollte ich hier überhaupt byte buddy benutzen oder gibt es einen einfacheren / anderen Weg?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage