2016-09-06 3 views
0

Warm Wünsche an alle contrbutors,Unterschiedlich Klasse aufrufen gängige Methode

Ich habe eine triviale noch nagende Problem bei dem Versuch, verschiedene Klasse aufrufen, eine gemeinsame Klasse zu ermöglichen, eine gemeinsame Methode aufzurufen.

Ich habe eine Klasse CommonLogin genannt, die eine Login-Aktion ausführt, ich habe auch eine Klasse, die die TestACommonLogin Klasse nennen, die Login-Aktion ausführen, und dann wieder auf TestA Ausführung fortzusetzen. Die Rückkehr zu TestA erfolgt durch die Methode TestA.runTest(testcase,url), die die CommonLogin Klasse ist.

Die Klasse TestA ist jedoch nur eine der vielen Klassen, die die Klasse CommonLogin aufrufen, um die gleiche Anmeldefunktion auszuführen. Mein Problem ist, dass ich den Klassennamen in TestA.runTest(testcase,url) als eine Variable machen möchte, aber die Methode runTest beibehalten. Das gewünschte Ergebnis ist wie folgt:

classname.runTest(testcase, url); ==> Anfangs Syntax in Code in CommonFunction Klasse

Wenn Klasse TestA ausgeführt wird, dann ist die obige Syntax wird als
TestA.runTest(testcase, url);

Während der zweiten bezeichnet werden Runde der Ausführung, eine Klasse namens TestB wird ausgeführt, und dies wird die obige Syntax mit TestB.runTest(testcase, url);

bezeichnen Der Grund für die Syntax classname.runTest(testcase, url) besteht darin, unterschiedlichen Klassenaufruf an die Klasse CommonLogin zu erlauben, um die Methode runTest auszuführen.

Im Moment verwende ich in meiner CommonLogin Klasse eine if-else if-Anweisung, wobei, wenn TestA Klasse aufrufen, führen Sie die gemeinsame Login-Aktion und dann die TestA.runTest(testcase, url). Wenn die Klasse TestB aufruft, führen Sie die allgemeine Login-Aktion und dann TestB.runTest(testcase, url); aus. Auf diese Weise besteht mein Code aus zwei Schritten der Login-Aktion, nur dass er die andere Methode aufruft. Wenn TestC, D, E und so weiter kommen, werde ich einen riesigen Klumpen von Replikaten der Login-Aktion haben, in denen ich versuche zu vermeiden.

Vielen Dank im Voraus für den Rat.

+5

Es ist sehr schwer, die Frage zu folgen. Könnten Sie einen Beispielcode bereitstellen und zeigen, was Sie bereits versucht haben? – Mureinik

+0

Hallo @Mureinik, vielen Dank für Ihren Rat. Hier ist der Link zu den Codes für Ihre Referenz https://drive.google.com/drive/folders/0B5ummyLW4FRrZkN6VXhUM1Nub1U – brian78

Antwort

0

Die Verwendung einer Klasse als Variable könnte mit .class und Reflexion erfolgen; Ihre Anmeldemethode könnte Reflektion verwenden, um Ihre Klasse nach einer runTest Methode zu durchsuchen und diese auszuführen. Das ist jedoch komplizierter als Sie brauchen.

Angenommen, Sie verwenden Java 8 (ich hoffe, da Java 7 das Ende der Lebensdauer überschritten hat), ist der beste Weg, als Parameter eine Methodenreferenz für eine Methode zur Verfügung zu stellen Prüfung. Die Testmethode benötigt vermutlich zwei Argumente und gibt kein Ergebnis zurück. Java definiert bereits eine Reihe von integrierten Schnittstellen für solche Zwecke. Siehe http://docs.oracle.com/javase/8/docs/api/java/util/function/package-summary.html. Die eine, die Sie wahrscheinlich wollen, ist BiConsumer, die zwei Argumente braucht und kein Ergebnis erzeugt. So könnte Ihre Login-Methode wie folgt aussehen:

public ..whatever.. login(...other parameters..., BiConsumer<TestCase, String> testMethod) { ... } 

Ich weiß nicht, welche Klasse die „Testfall“ Sie sich beziehen ist; ersetzen Sie TestCase mit allem, was angemessen ist.Nun, in Ihrem Login-Methode, können Sie den Test wie folgt nennen würde (unter der Annahme, testCase ist ein TestCase):

testMethod.accept(testCase, url); 

accept ist der Name des Interface-Methode in BiConsumer. (. Andere Klassen in diesem Paket verwenden unterschiedliche Methodennamen, zB apply)

Wenn Sie die Login-Methode aufrufen, Ihre Klasse unter der Annahme erklärt, eine runTest Methode:

public void runTest(TestCase testCase, String url) { ... } 

Sie die Login-Methode wie folgt nennen würde :

CommonLogin.login(....., this::runTest); 

, die einen Verweis auf runTest gibt, die auf dem „this“ Objekt ausgeführt werden. Wenn runTest statisch ist, jedoch könnte man es so nennen:

CommonLogin.login(....., TestA::runTest); 

oder so, werden Sie einen Verweis auf ein Verfahren werden vorbei, und login wird diese Methode aufrufen, wenn es testMethod.accept aufruft.

(Beachten Sie, dass, wenn Sie dies tun, die Methode nicht runTest benannt werden muss.)

+0

Vielen Dank @ajb für Ihre Mühe bei der Bereitstellung einer so umfassenden Erklärung. Da ich BiConsumer nicht sehr gut kenne, lasst mich zuerst die Grundlagen durchgehen. Aber nochmals vielen Dank für Ihre Zeit und Mühe. – brian78

Verwandte Themen