我尝试使用相同的类来进行测试定义和 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/