热烈祝愿所有的倡导者,
在尝试允许各种类调用公共类来调用常用方法时,我遇到了一个微不足道的问题。
我有一个名为CommonLogin
的类执行登录操作,我还有一个类TestA
,它将调用CommonLogin
类,运行登录操作,然后返回到TestA
继续执行。返回TestA
的方法是TestA.runTest(testcase,url)
类CommonLogin
。
但是,类TestA
只是调用CommonLogin
类以运行相同登录功能的众多类之一。我的问题是我希望将TestA.runTest(testcase,url)
中的类名作为变量,但保留方法runTest
。期望的结果如下:
classname.runTest(testcase, url);
==> CommonFunction
类
如果执行了类TestA
,则上述语法将被指定为
TestA.runTest(testcase, url);
在第二轮执行期间,执行了一个名为TestB
的类,这将指定上述语法
TestB.runTest(testcase, url);
使用语法classname.runTest(testcase, url)
的原因是允许对CommonLogin
类的不同类调用来运行runTest
方法。
目前,在我的CommonLogin
类中,我正在使用if-else if语句,如果TestA
类正在调用,则运行常用的Login操作,然后运行TestA.runTest(testcase, url)
。如果正在调用TestB
类,则运行常用的Login操作,然后运行TestB.runTest(testcase, url);
。通过这种方式,我的代码包含两个登录操作的chucnks,只是它调用了不同的方法。如果TestC,D,E等进来,我会有很多Login操作的副本,我试图避免。
提前感谢您的建议。
答案 0 :(得分:0)
使用类作为变量可以使用.class
和反射来完成;您的登录方法可以使用反射在您的类中搜索runTest
方法并执行该方法。但是,这比你需要的更复杂。
假设您正在使用Java 8(我希望如此,因为Java 7已经过了生命周期终止),我认为最好的方法是提供一个方法参考作为参数来运行方法考试。测试方法可能需要两个参数,而不会返回结果。 Java已经为此目的定义了许多内置接口。见http://docs.oracle.com/javase/8/docs/api/java/util/function/package-summary.html。你可能想要的是BiConsumer
,它接受两个参数并且不产生结果。所以你的登录方法可能如下:
public ..whatever.. login(...other parameters..., BiConsumer<TestCase, String> testMethod) { ... }
我不知道&#34; testcase&#34;你指的是;用适当的东西替换TestCase
。现在,在您的登录方法中,您可以像这样调用测试(假设testCase
是TestCase
):
testMethod.accept(testCase, url);
accept
是BiConsumer
中接口方法的名称。 (该包中的其他类使用不同的方法名称,例如apply
。)
当您调用login方法时,假设您的类声明了runTest
方法:
public void runTest(TestCase testCase, String url) { ... }
您可以像这样调用登录方法:
CommonLogin.login(....., this::runTest);
传递对runTest
的引用,该引用将在&#34;&#34;宾语。但是,如果runTest
是静态的,您可以这样称呼它:
CommonLogin.login(....., TestA::runTest);
无论哪种方式,您都会传递对方法的引用,login
会在调用testMethod.accept
时调用该方法。
(请注意,当您执行此操作时,该方法不必命名为runTest
。)