繁体   English   中英

Java-在方法内部创建一个返回Stub接口

[英]Java - Create an return a Stub interface inside a method

我有这个界面

public interface MQTTClient {

     public void prepareAndSend(String recipient, String message);

}

出于测试目的,我想制作一个这样的配置类

@Configuration
public class TestServiceConfig {


    @Bean
    public MQTTClient mqttClient() {

        return new {

        public class MQTTClientImpl implements MQTTClient {


            @Override
            public void prepareAndSend(String recipient, String message) {
                // TODO Auto-generated method stub

            }
        }
        }
    }
}

但是我不知道这是否可行

当然可以,通常有3种方法可以做到这一点:

  1. 像您所做的那样,自己实现它,您可能需要@Primary来确保弹簧加载。
  2. 您不需要自己实现它,可以考虑使用Mockito类的Mockito框架,您只需要这样做:

     @Primary @Bean public MQTTClient mqttClient() { return Mockito.mock(MQTTClient.class); } 
  3. 如果您使用的是spring-boot ,则可以从版本1.4.x使用注释@MockBean

您必须将单元测试用于测试目的,而不是在配置文件中。 您必须声明内部类或创建匿名类。在本示例中,您尝试在同一块中创建对象和类声明。因此Java无法创建未声明类的对象。首先声明类,然后创建该类的对象。

匿名:

   return new MQTTClient {
           @Override
           public void prepareAndSend(String recipient, String message) {
               // TODO Auto-generated method stub
           }
   }

内部舱位:

   class MQTTClientImpl implements MQTTClient {

       @Override
       public void prepareAndSend(String recipient, String message) {
           // TODO Auto-generated method stub

       }
    }

    public MQTTClient mqttClient() {
       return new MQTTClientImpl();
    }

注意:

实际上,如果您正在测试接口,则意味着您正在等待该接口的实现。因此内部类或匿名类不适用于此目的,因为必须将测试级别与业务级别分开,否则稍后您将对代码感到困惑。如果您只是假设实现已通过并继续应用程序的其余部分,请使用模拟。当真正的实现出现时,请使用真正的实现类进行测试。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM