Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 动态方法调度_Java_Oop_Testng_Dynamic Data - Fatal编程技术网

Java 动态方法调度

Java 动态方法调度,java,oop,testng,dynamic-data,Java,Oop,Testng,Dynamic Data,互联网上有很多关于动态调度的信息,我感觉自己像一只鸡,因为我无法实现它。请帮帮我。这就是我要做的 ClassA{ public void createReq(){ } public String postReq(){ } } ClassB{ @Test public void myTest(){ Class A = new ClassA(); a.createReq(); String test = a.getResponse(); /* Not su

互联网上有很多关于动态调度的信息,我感觉自己像一只鸡,因为我无法实现它。请帮帮我。这就是我要做的

ClassA{

    public void createReq(){
    }

    public String postReq(){
    }

}

ClassB{

@Test
public void myTest(){
Class A = new ClassA();
a.createReq();
String test = a.getResponse();

/* Not sure how do i do this part */

}
因此,我在
myTest
方法中得到一个字符串
'test'
。我想创建一个扩展
ClassB
ClassC
,并编写一个方法,在步骤后不久(
a.getResponse()
)验证
myTest
中返回的字符串

如果没有实现
ClassC
,我只想简单地结束测试。如果只有
ClassC
存在并实现了一个验证方法,我希望完成验证


我该怎么做?请帮忙。谢谢。

尝试加载带有反射的ClassC。 如果该尝试失败,则ClassC不存在,因此默认情况下验证是正常的。 如果ClassC存在,请尝试找到合适的方法并使用反射调用它。 如果您没有找到该方法,那么验证在默认情况下也是可以的(我猜)。 如果您找到了该方法,并且对它的调用返回true,那么您就完成了验证。如果此调用返回false,则验证失败

检查这些链接,我想你应该明白我说的


您可以创建一个
Dispatcher
接口,该接口只定义一个方法
dispatch(String)
(或您尝试实现的任何方法)。基类(ClassB)使用NullPattern实现接口,而子类(ClassC)根据需要实现接口

界面非常简单:

public interface Dispatcher
{
    public void dispatch(String message);
}
NullPattern的实现方式如下:

public class NullDispatcher implements Dispatcher
{
    public void dispatch(String message)
    {
        // do nothing
    }
}
public class ClassB
{
    private Dispatcher dispatcher;

    public ClassB()
    {
        dispatcher = new NullDispatcher();
    }

    public void setDispatcher(Dispatcher dispatcher)
    {
        // change this to your needs
        if (dispatcher == null)
            dispatcher = new NullDispatcher();
        else
            this.dispatcher = dispatcher;
    }

    @Test
    public void myTest()
    {
        ClassA a = new ClassA();
        a.createRequest();
        String test = a.getResponse();

        dispatcher.dispatch(test);
    }
}
public class ConsoleDispatcher implements Dispatcher
{
    public void dispatch(String message)
    {
        System.out.println(message);
    }
}
ClassB应该这样修改:

public class NullDispatcher implements Dispatcher
{
    public void dispatch(String message)
    {
        // do nothing
    }
}
public class ClassB
{
    private Dispatcher dispatcher;

    public ClassB()
    {
        dispatcher = new NullDispatcher();
    }

    public void setDispatcher(Dispatcher dispatcher)
    {
        // change this to your needs
        if (dispatcher == null)
            dispatcher = new NullDispatcher();
        else
            this.dispatcher = dispatcher;
    }

    @Test
    public void myTest()
    {
        ClassA a = new ClassA();
        a.createRequest();
        String test = a.getResponse();

        dispatcher.dispatch(test);
    }
}
public class ConsoleDispatcher implements Dispatcher
{
    public void dispatch(String message)
    {
        System.out.println(message);
    }
}
这里可以使用
setDispatcher(Dispatcher)
方法设置新的
Dispatcher
。此分派器将在
myTest
中用于分派
a.getResponse()
的结果

扩展类只需要设置
调度程序的特定实现。F.e.要将响应打印到控制台,您可以实现如下
ConsoleDispatcher

public class NullDispatcher implements Dispatcher
{
    public void dispatch(String message)
    {
        // do nothing
    }
}
public class ClassB
{
    private Dispatcher dispatcher;

    public ClassB()
    {
        dispatcher = new NullDispatcher();
    }

    public void setDispatcher(Dispatcher dispatcher)
    {
        // change this to your needs
        if (dispatcher == null)
            dispatcher = new NullDispatcher();
        else
            this.dispatcher = dispatcher;
    }

    @Test
    public void myTest()
    {
        ClassA a = new ClassA();
        a.createRequest();
        String test = a.getResponse();

        dispatcher.dispatch(test);
    }
}
public class ConsoleDispatcher implements Dispatcher
{
    public void dispatch(String message)
    {
        System.out.println(message);
    }
}
要在
ClassC
中使用
ConsoleDispatcher
而不是
NullDispatcher
,可以使用类似以下代码:

public class ClassC extends ClassB
{
    public ClassC()
    {
        this.setDispatcher(new ConsoleDispatcher());
    }
}
随着ClassC扩展ClassB,您将有权访问
myTest
,它使用定义的分派器相应地分派消息


HTH

这与动态调度有什么关系?@OliCharlesworth:有没有其他方法可以实现这一点?或者我的问题应该是:我如何才能做到以上几点?顺便说一句,我认为Roman Vottner的解决方案会更干净、更容易实现。