Java-在方法内创建一个返回存根接口

Java-在方法内创建一个返回存根接口,java,spring,spring-mvc,Java,Spring,Spring Mvc,我有这个接口 public interface MQTTClient { public void prepareAndSend(String recipient, String message); } 出于测试目的,我想创建一个这样的配置类 @Configuration public class TestServiceConfig { @Bean public MQTTClient mqttClient() { return new {

我有这个接口

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

            }
        }
        }
    }
}

但我不知道这是否可行

当然有可能,通常有三种方法:

  • 和您所做的一样,您也可以自己实现它,您可能需要
    @Primary
    来确保spring加载这一个
  • >p>你不需要自己实现它,考虑使用嘲讽框架,比如<代码> Mockito <代码>,你只需要这样做:

    @Primary
    @Bean
    public MQTTClient mqttClient() {
        return Mockito.mock(MQTTClient.class);
    }
    
  • 如果您使用的是
    springboot
    ,则可以使用注释
    @MockBean
    ,因为版本
    1.4.x

  • 当然这是可能的,通常有三种方法:

  • 和您所做的一样,您也可以自己实现它,您可能需要
    @Primary
    来确保spring加载这一个
  • >p>你不需要自己实现它,考虑使用嘲讽框架,比如<代码> Mockito <代码>,你只需要这样做:

    @Primary
    @Bean
    public MQTTClient mqttClient() {
        return Mockito.mock(MQTTClient.class);
    }
    
  • 如果您使用的是
    springboot
    ,则可以使用注释
    @MockBean
    ,因为版本
    1.4.x

  • 您必须使用单元测试进行测试,而不是在配置文件中。 您必须声明内部类或创建匿名类。在本例中,您试图在同一块中创建对象和类声明。因此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();
        }
    
    注:

    实际上,若您正在测试接口,那个就意味着您正在等待 这个接口的实现。所以内部类或匿名类是 不适用于此目的。因为测试级别必须与 业务级别。否则以后您将在代码中感到困惑。如果 您只需假设实现已通过,然后继续本部分的其余部分 然后应用程序使用模拟。当真正实现时,使用 要测试的实际实现类


    您必须使用单元测试进行测试,而不是在配置文件中。 您必须声明内部类或创建匿名类。在本例中,您试图在同一块中创建对象和类声明。因此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();
        }
    
    注:

    实际上,若您正在测试接口,那个就意味着您正在等待 这个接口的实现。所以内部类或匿名类是 不适用于此目的。因为测试级别必须与 业务级别。否则以后您将在代码中感到困惑。如果 您只需假设实现已通过,然后继续本部分的其余部分 然后应用程序使用模拟。当真正实现时,使用 要测试的实际实现类