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

时间:2017-04-20 19:28:52

标签: 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 class MQTTClientImpl implements MQTTClient {


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

            }
        }
        }
    }
}

但我不知道这是否可行

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:1)

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

注意:

  

实际上,如果您正在测试界面,则意味着您正在等待   实现这个接口。所以内部类或匿名类是   不适合此目的。因为测试级别必须分开   商业水平。否则你会在你的代码中感到困惑。如果   你只是假设实现通过并继续其余的   然后应用程序使用mocking。当真正的实现来使用时   真正的实现类来测试。