2017-05-11 1 views
0

J'ai quelques méthodes commeComment écrire une méthode qui exécute une autre méthode reçue en paramètre dans Java 7?

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())); 
} 

Ces méthodes chercher quelque chose et quand pas trouvé jeter une exception. Qu'est-ce que je voudrais faire est d'écrire une méthode qui exécute l'une de ces méthodes afin que je puisse essayer de trouver quelque chose plusieurs fois avant de finalement jeter l'exception. Le long de ces méthodes sont 10 autres ou plus.

J'ai essayé d'utiliser le modèle de stratégie et le modèle de commande, mais soit ils ne fonctionnaient pas pour moi, soit je ne savais pas comment les implémenter. Si la solution en est une, pourriez-vous me montrer une explication claire ou le faire dans la réponse?

J'ai cherché des tutoriels d'entre eux, mais tous étaient très brefs et je ne suis pas un développeur senior à comprendre tout de suite.

Merci pour votre aide!

+4

Il serait préférable de poster le code que vous avez de la façon dont ces méthodes sont utilisées et quel est le résultat souhaité. – Strelok

+0

Cela dépend de ce que font ces méthodes. S'ils font fondamentalement la même chose mais opèrent sur des champs différents, vous pouvez passer un objet qui décrit votre "requête". Cet objet peut contenir des champs comme 'text' et le type pourrait être quelque chose de nullable (où' null' signifierait 'ne pas l'utiliser') ou 'optionnel ' (où 'isPresent()' renvoie false pour indiquer qu'il ne devrait pas ne pas être utilisé) ou autre chose. De cette façon, vous n'aurez probablement pas besoin d'appeler plusieurs méthodes, mais de le faire d'un seul coup - à nouveau: à condition qu'elles soient très similaires. – Thomas

+0

Mise à jour de la question avec les méthodes exactes. Ils sont utilisés pour trouver des vues avec un expresso. –

Répondre

0

Je suppose que vos méthodes de recherche prennent un certain temps à compléter. Si oui, ou s'il y en a beaucoup, alors vous devriez probablement utiliser un ScheduledThreadPoolExecutor, qui est venu avec Java7, submit toutes les tâches enveloppées comme Callables puis continuer à interroger chaque Future (en utilisant get(long, TimeUnit) avec un court délai) jusqu'à ce que vous obteniez un résultat utilisable ou arrêtez-vous après un certain délai général (vous devez implémenter ce dernier vous-même, mais c'est facile avec System.nanoTime()). Vous pouvez envelopper vos méthodes comme ceci:

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

Juste pour être complet, en Java 8 que vous préférez faire

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

De cette façon, vous pouvez exécuter simultanément toutes les méthodes (vous pouvez choisir le nombre de threads sont en train de traiter vos callables, donc vous pouvez commencer avec 1 et augmenter le parallélisme plus tard, quand tout devient plus complexe). Notez que get() lancera un ExecutionExceptionn au cas où votre méthode findView() serait une exception.

Si cela est trop complexe, vous pouvez toujours utiliser les Callables pour implémenter votre modèle de commande.