将测试类和配置类组合在一个类中?

时间:2015-10-19 13:16:29

标签: java spring dependency-injection spring-test

我尝试将同一个类用于测试定义和spring上下文配置。

下面是类CombineTestAndConfigTry的代码,它既可以作为测试定义,也可以作为自身的上下文定义。

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

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

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

问题是:这种用法有多正常,如果使用它可以遇到哪些问题?

同样有趣(以及如何知道),@Autowired执行了多少次?两次因为这两个角色?或者有一次因为春天看到了这种情况?

@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());
   }

}

1 个答案:

答案 0 :(得分:1)

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

"清洁编码"最重要的规则之一(参见Robert Martin的书)是SRP - 单一责任原则。任何类(以及其中的任何方法)都可以做一件事;还有一件事。含义:"需要改变"应始终来自一个"来源&#34 ;;而不是几个。

长话短说:你所要求的被认为是(非常)糟糕的做法。

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