【问题标题】:how to inject interface to class in java?如何将接口注入java中的类?
【发布时间】:2014-11-28 14:22:49
【问题描述】:

我的 DTO 课程是:

public class EmailResponse {

    // Make public to avoid getters and setters
    public Email email;
    public RequestData reqData;    

    public EmailResponse() {
        super();
    }

}

我想实现这个接口:

public interface IAssertionErrorDo {
    public void onErrorDo();
}

但我想在执行期间执行此操作,我不想触摸“EmailResponse”,因为它们不属于同一层,因此无法实现该接口,我的意思是,EmailResponse 会属于服务层,IAssertionError 属于测试层。我正在使用TestNG。

你知道我该怎么做吗?问候

编辑: 我的实现是这样的:

EmailResponse emailResponse = emailService.getUserEmail(userId);

而我想做这种“注射”的原因是因为我有

public class LoggingAssert
    extends Assertion {

    private static final Logger LOGGER = LoggerFactory.getLogger(LoggingAssert.class);
    private IAssertionErrorDo dataE;
    @Override
    public void onAssertFailure(IAssert a, AssertionError ex) {
        LOGGER.info("[ERROR] " + a.getMessage());
        if (this.dataE != null) {
            this.dataE.onErrorDo();
        }
    }

    public LoggingAssert setOnErrorDo(IAssertionErrorDo object) {
        this.object = object;
        return this;
    }
}

loggingAssert.setOnErrorDo(emailResponse).assertNotNull(emailResponse.getEmail().getId(),
            "Checking created email doesn't exists");

所以我想如果断言失败从 emailResponse 执行方法 onErrorDo()

【问题讨论】:

    标签: java interface inject


    【解决方案1】:

    你可以的

    public class MyEmailResponse extends EmailResponse implements IAssertionErrorDo {
    ...
    }
    

    【讨论】:

    • OP 明确不想只实现接口,因为它仅用于测试。
    • 这是一个选项。我想过在测试层这样做。但一方面,我会为我拥有的每个 DTO 开设一个课程(我拥有的不仅仅是 EmailResponse)。除此之外,我的服务层方法返回给我一个 EmailResponse,我怎样才能将此 EmailResponse 转换为 MyEmailResponse?感谢您的帮助
    【解决方案2】:

    接口中的实现调用,如果需要,可以通过添加逗号来调用多个接口。..

    要调用接口方法,您只需使用方法的名称即可。

    像这样:

    public class MyEmailResponse implements IAssertionErrorDo 
    {
      public void onErrorDo() {//define it's behavior}
    } 
    

    如果你扩展你使用的类: super.MyMethod() 在扩展类中调用 a 方法,但是如果您已经有一个扩展类并且想要另一个类的方法,则必须先为该类创建一个对象然后调用它,因此:

    MyClass mc = new MyClass();

    如果它在不同的包中,那么

    myPackage.MyClass mc = new myPackage.MyClass(); 然后您使用您创建的对象从该类调用您的方法,在本例中为 mc.. 所以:

    mc.MyMethod();

    如果您希望它返回一个变量,那么您需要在该方法中添加一个返回语句以及您希望它返回的变量。

    接口通常用于全局变化的环境(动态),例如,如果您开发了一个程序并且它需要驱动程序来连接到数据库,那么您将制作一个接口并将其发送给数据库开发人员,每个人都会在该界面中填写代码并将其发送回......这保证了一致性。 当您实现一个接口时,您必须在其中定义每个方法(即使您将其留空)并且您不能更改接口的方法名称也不能添加......它也用于其他领域,我认为您不需要在你的情况下使用它。

    【讨论】:

    • 这怎么可能是实现呢?我用我实际拥有它的方式编辑了这篇文章。感谢您的帮助
    • 我无法理解那里的目标.. 但是您是否要创建异常处理程序?
    • 我再次编辑:P 对不起。如果断言失败,我想做 onErrorDo() 方法。
    • 如果您尝试调用静态方法,那么为什么要使用接口?您可以为测试和处理程序创建一个类,然后您只需调用该方法即可。您可以将扩展用于测试级别,如果它是另一个级别并且您想在其中进行测试,那么您可以这样做:ClassName cn = new ClassName(); cn.yourMethod();
    • 是的,例如,我有 emailResponse.showRequestLogs() 方法。我希望它在 AssertionError 上被调用。我没有办法让这件事发生……
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-20
    • 2011-05-06
    • 1970-01-01
    • 2017-04-19
    • 2016-11-06
    • 2015-04-06
    相关资源
    最近更新 更多