2017-05-11 3 views
0

Ich habe einige Methoden wieWie schreibe ich eine Methode, die eine andere Methode als Parameter in Java 7 erhalten?

public static ViewInteraction findView(int id) { 
    return onView(allOf(withId(id), isDisplayed())); 
} 

public static ViewInteraction findView(int id, int index){ 
    return onView(allOf(withIndex(withId(id), index), isDisplayed())); 
} 

public static ViewInteraction findView(int id, String text) { 
    return onView(allOf(withText(text), withId(id))); 
} 

public static ViewInteraction findView(String text) { 
    return onView(allOf(withText(text), isDisplayed())); 
} 

Diese Methoden suchen nach etwas, und wenn sie nicht werfen eine Ausnahme gefunden.

Was ich tun möchte, ist eine Methode schreiben, die eine dieser Methoden ausführt, so dass ich versuchen kann, etwas mehrmals zu finden, bevor schließlich die Ausnahme ausgelöst wird. Entlang dieser Methoden sind andere 10 mehr oder so.

Ich versuchte, das Strategie-Muster und das Befehlsmuster zu verwenden, aber entweder funktionierten sie nicht für mich oder ich wusste nicht, wie man sie umsetzt. Wenn die Lösung eine solche ist, könnten Sie mir eine klare Erklärung geben oder es in der Antwort tun?

Ich suchte nach Tutorials von ihnen, aber alle waren wirklich kurz und ich bin kein Senior-Entwickler, um sofort zu verstehen.

Danke für Ihre Hilfe!

+4

Es wäre am besten, den Code zu veröffentlichen, den Sie haben, wie diese Methoden verwendet werden und was das gewünschte Ergebnis ist. – Strelok

+0

Das hängt davon ab, was diese Methoden tun. Wenn sie grundsätzlich dasselbe tun, aber auf verschiedenen Feldern operieren, können Sie ein Objekt übergeben, das Ihre "Abfrage" beschreibt. Dieses Objekt könnte Felder wie 'text' enthalten und der Typ könnte entweder Nullable sein (wobei' null' bedeuten würde "nicht benutzen") oder 'Optional ' (wobei 'isPresent()' false zurückgibt, um anzuzeigen, dass es nicht sein sollte nicht benutzt werden) oder etwas anderes. Auf diese Weise müssten Sie wahrscheinlich nicht mehrere Methoden aufrufen, aber auf einen Schlag - wieder: vorausgesetzt, sie sind sich sehr ähnlich. – Thomas

+0

Aktualisiert die Frage mit den genauen Methoden. Sie werden verwendet, um Ansichten mit Espresso zu finden. –

Antwort

0

Ich gehe davon aus, dass Ihre Suchmethoden einige Zeit in Anspruch nehmen. Wenn ja, oder wenn es viele von ihnen gibt, dann sollten Sie wahrscheinlich eine ScheduledThreadPoolExecutor verwenden, die mit Java7, submit alle Aufgaben als Callables verpackt und dann polling jedes Future (mit get(long, TimeUnit) mit einem kurzen Timeout), bis Sie ein brauchbares Ergebnis erhalten oder nach einem allgemeinen Timeout anhalten (Sie müssen das letzte selbst implementieren, aber das ist einfach mit System.nanoTime()). Sie können Ihre Methoden wie so wickeln:

Callable<ViewInteraction> method1 = new Callable<ViewInteraction>() { 
    @Override 
    public ViewInteraction call() throws Exception { 
     return findView(id, text); 
    } 
}; 

Nur der Vollständigkeit halber, in Java 8 Sie eher

Callable<ViewInteraction> method2 =() -> findView(id, text); 

Auf diese Weise tun würde, Sie alle Methoden gleichzeitig ausgeführt werden können (Sie können wählen, wie viele Threads bearbeiten Ihre Callables, so können Sie mit 1 beginnen und später die Parallelität erhöhen, wenn alles komplexer wird. Beachten Sie, dass get() eine ExecutionExceptionn werfen wird, falls Ihre findView() Methode eine Ausnahme ist.

Wenn das zu komplex ist, können Sie die Callables weiterhin verwenden, um Ihr Befehlsmuster zu implementieren.

Verwandte Themen