java - 将测试类和配置类合并在一个类中?

标签 java spring dependency-injection spring-test

我尝试使用相同的类来进行测试定义和 Spring 上下文配置。

下面是类 CombineTestAndConfigTry 的代码,它既充当测试定义又充当自身的上下文定义。

bean1 只是 stub bean。 bean2 应包含类的名称,bean3 应包含对类的引用。

很明显,Spring 将测试类实例包装到不同的类中,因此测试失败。

同时,一些信息似乎可以从测试类传递到 spring 上下文。

问题是:这种使用方式是否正常,使用时会遇到哪些问题?

也很有趣(以及如何知道),@Autowired 被执行了多少次?因为两个角色两次?或者一次是因为 Spring 看到了这种情况?

@Configuration
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = CombineTestAndConfigTry.class)
public class CombineTestAndConfigTry {


   public static class MyBean1 {
      {
         System.out.println("MyBean1 constructor");
      }
   }

   public static class MyBean2 {

      private String configName;

      {
         System.out.println("MyBean2 constructor");
      }

      public String getConfigName() {
         return configName;
      }

      public void setConfigName(String configName) {
         this.configName = configName;
         System.out.println("MyBean2#configName set");
      }
   }

   public static class MyBean3 {

      private CombineTestAndConfigTry testInstance;

      {
         System.out.println("MyBean3 constructor");
      }

      public CombineTestAndConfigTry getTestInstance() {
         return testInstance;
      }

      public void setTestInstance(CombineTestAndConfigTry testInstance) {
         this.testInstance = testInstance;
         System.out.println("MyBean3#testInstance set");
      }
   }

   public String getConfigName() {
      return getClass().getSimpleName();
   }

   @Bean
   public MyBean1 myBean1() {
      return new MyBean1();
   }

   @Bean
   public MyBean2 myBean2() {
      MyBean2 ans = new MyBean2();
      ans.setConfigName( getConfigName() );
      return ans;
   }

   @Bean
   public MyBean3 myBean3() {
      MyBean3 ans = new MyBean3();
      ans.setTestInstance(this);
      return ans;
   }

   @Autowired
   public MyBean1 myBean1;

   @Autowired
   public MyBean2 myBean2;

   @Autowired
   public MyBean3 myBean3;

   @Test
   public void testGetConfigName() {
      assertEquals( getConfigName(), myBean2.getConfigName() );
   }

   @Test
   public void testGetTestInstance() {
      assertSame(this, myBean3.getTestInstance());
   }

}

最佳答案

我对你问题的回答是:不要这样做(这样)。

“干净编码”最重要的规则之一(参见 Robert Martin 的书)是 SRP - 单一责任原则。任何类(以及其中的任何方法)都可以做一件事;只有一件事。含义:“变革的需要”应该始终来自一个“源头”;而且不是几个。

长话短说:您所要求的被认为是(非常)不好的做法。

如果您这样做是为了避免另一个原则 DRY(不要重复自己)...那么请考虑改变您的设计的方法。

关于java - 将测试类和配置类合并在一个类中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33215448/

相关文章:

java - Spring Boot 将 JAX-WS webservice 注册为 bean

java - Java 中的轻量级线程?

java - 为什么我的 ChangeListener 只对 JMenu 有反应,而不对 JMenuItem 有反应?

java - Spring Security 中的 AuthenticationSuccessHandler

c# - 自己的服务 - 没有注册类型的服务

php - 让这个类符合依赖倒置原则

Angular 将服务以编程方式注入(inject)到函数中

JAVA 8 可选 map 否则

java - 如何使用泛型在抽象类中注入(inject)服务

java - Spring Security @Secured 注解和用户权限