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

Java 在一个类中组合测试类和配置类?,java,spring,dependency-injection,spring-test,Java,Spring,Dependency Injection,Spring Test,我尝试将同一个类用于测试定义和spring上下文配置 下面是类CombineTestAndConfigTry的代码,该类本身既是测试定义又是上下文定义 bean1只是存根beanbean2应包含类的名称,bean3应包含对类的引用 很明显,Spring正在将测试类实例包装到不同的类中,所以测试失败了 同时,似乎有些信息可以从测试类传递到spring上下文 问题是:这种使用有多正常?如果使用它,我会遇到哪些问题 另外,有趣的是(以及如何知道),执行了多少次@Autowired?两次都是因为两个角色

我尝试将同一个类用于测试定义和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());
   }

}

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

“干净编码”最重要的规则之一(见罗伯特·马丁的书)是SRP——单一责任原则。任何类(以及其中的任何方法)都是为了做一件事;只有一件事。意思是:“变革的需要”应该总是来自一个“源头”;而不是几个

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


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

不要这样做,配置和测试是不同的事情,您只会混淆框架,更不用说其他开发人员了。现在您将得到两个实例,一个用于配置,一个用于测试…我正在寻找。还没有其他办法。无论如何,这些“原则”不应该被视为公理。但对我来说,它们非常接近公理。当您不遵循它们时,您很可能会得到更难阅读和维护的代码。这两个属性是源代码最重要的两个属性;在我眼里。但这里没有必要进行基于意见的讨论。与所有事情一样,开发人员必须在规则要求的内容和对特定情况最有意义的内容之间进行平衡。