【问题标题】:Dynamic method dispatch动态方法分派
【发布时间】:2014-01-18 09:47:44
【问题描述】:

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

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'。我想创建一个扩展ClassBClassC 并编写一个方法来验证在步骤(a.getResponse())之后不久在myTest 中返回的字符串。

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

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

【问题讨论】:

  • 这和动态调度有什么关系?
  • @OliCharlesworth:还有其他方法可以实现吗?或者我的问题应该是:我将如何做到以上几点?

标签: java oop testng dynamic-data


【解决方案1】:

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

检查这些链接,我想你应该明白我在说什么。

http://docs.oracle.com/javase/7/docs/api/java/lang/Class.html#forName%28java.lang.String%29

http://docs.oracle.com/javase/7/docs/api/java/lang/Class.html#getMethod%28java.lang.String,%20java.lang.Class...%29

http://docs.oracle.com/javase/7/docs/api/java/lang/reflect/Method.html#invoke%28java.lang.Object,%20java.lang.Object...%29

【讨论】:

  • 我认为,Btw Roman Vottner 的解决方案会更简洁、更易于实施。
【解决方案2】:

您可以创建一个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
    }
}

ClassB 应该这样修改:

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

这里可以使用setDispatcher(Dispatcher) 方法设置一个新的Dispatcher。此调度程序将用于myTest 以调度a.getResponse() 的结果。

扩展类只需要设置Dispatcher的具体实现即可。 F.e.要将响应打印到控制台,您可以像这样实现ConsoleDispatcher

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-29
    • 2018-04-21
    • 2013-01-13
    • 1970-01-01
    相关资源
    最近更新 更多