我尝试将同一个类用于测试定义和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());
}
}
答案 0 :(得分:1)
我对你的问题的回答是:不要这样做(这样)。
"清洁编码"最重要的规则之一(参见Robert Martin的书)是SRP - 单一责任原则。任何类(以及其中的任何方法)都可以做一件事;还有一件事。含义:"需要改变"应始终来自一个"来源&#34 ;;而不是几个。
长话短说:你所要求的被认为是(非常)糟糕的做法。
如果你这样做是为了避免另一个原则DRY(不要重复自己)......那么想想改变你的设计的方法。