Java 单元测试中的Spring-Skip初始化方法
我希望在Junit测试用例中测试Spring配置,而不调用已配置bean上的init方法。我本可以根据测试用例中设置的系统属性对init方法进行编码以跳过实际工作,但我正在寻找更干净的解决方案。您的JUnit测试是否使用相同的Spring上下文配置文件?我猜答案是肯定的。。。如果您的测试使用备用的spring配置,那么它将简化问题 我使用过的最干净的方法之一利用了一些方便的注释,如:Java 单元测试中的Spring-Skip初始化方法,java,spring,Java,Spring,我希望在Junit测试用例中测试Spring配置,而不调用已配置bean上的init方法。我本可以根据测试用例中设置的系统属性对init方法进行编码以跳过实际工作,但我正在寻找更干净的解决方案。您的JUnit测试是否使用相同的Spring上下文配置文件?我猜答案是肯定的。。。如果您的测试使用备用的spring配置,那么它将简化问题 我使用过的最干净的方法之一利用了一些方便的注释,如: @RunWith(SpringJUnit4ClassRunner.class) @ContextConfigur
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
public class MovieServiceTest {
// ...
}
Spring将其称为“TestContext框架”,JUnit测试将查找一个名为“MovieServiceTest context.xml”的上下文配置文件,对于上面的示例
然后,可以在不使用init方法的情况下定义bean。虽然。。。您不想也测试一下吗?您的JUnit测试是否使用相同的Spring上下文配置文件?我猜答案是肯定的。。。如果您的测试使用备用的spring配置,那么它将简化问题 我使用过的最干净的方法之一利用了一些方便的注释,如:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
public class MovieServiceTest {
// ...
}
Spring将其称为“TestContext框架”,JUnit测试将查找一个名为“MovieServiceTest context.xml”的上下文配置文件,对于上面的示例
然后,可以在不使用init方法的情况下定义bean。虽然。。。您不想也测试一下吗?这是Spring配置XML中bean的属性init method指定的init方法吗?如果是这样的话,您就不能使用不同的上下文XML来运行测试,而不是在生产中使用来实现这一点吗?这是由Spring的配置XML中bean的属性init方法指定的init方法吗?如果是这样的话,您就不能使用不同的上下文XML来运行测试,而不是使用生产中使用的上下文XML来实现这一点吗?您可以走一条老路,扩展正在测试的类并重写init方法 或者可以重构一点,并注入init方法使用的init策略对象
不过我更喜欢testContext.xml方式 您可以走一条老路,扩展正在测试的类并重写init方法 或者可以重构一点,并注入init方法使用的init策略对象
不过我更喜欢testContext.xml方式 决定回答我自己的问题,分享找到的解决方案。不喜欢在没有init方法的情况下维护另一个配置文件副本的解决方案。我的解决方案并不完美,但能完成任务
public final static String INIT_METHOD_REGEX = "init-method=\"\\w+\"";
public final static String DESTROY_METHOD_REGEX = "destroy-method=\"\\w+\"";
public final static String PROPERTY_REGEX = "\\$\\{[^\\}]+\\}";
private static List<List<String>> subs = new ArrayList<List<String>>();
static {
subs.add(Arrays.asList( new String[] { INIT_METHOD_REGEX, "" }));
subs.add(Arrays.asList( new String[] { DESTROY_METHOD_REGEX, "" }));
subs.add(Arrays.asList( new String[] { PROPERTY_REGEX, "" }));
}
static public void testSpringConfig(String configFile) throws IOException {
URL springXml = Thread.currentThread().getContextClassLoader().getResource(configFile);
InputStream is = springXml.openStream();
byte[] buffer = new byte[8192];
int readBytes;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
while ((readBytes = is.read(buffer)) != -1)
baos.write(buffer, 0, readBytes);
String content = baos.toString();
for (List<String> s : subs)
content = content.replaceAll(s.get(0), s.get(1));
ByteArrayInputStream bais = new ByteArrayInputStream(content.getBytes());
InputSource isrc = new InputSource(bais);
GenericApplicationContext ctx = new GenericApplicationContext();
XmlBeanDefinitionReader xmlReader = new XmlBeanDefinitionReader(ctx);
xmlReader.setValidationMode(XmlBeanDefinitionReader.VALIDATION_NONE);
xmlReader.loadBeanDefinitions(isrc);
ctx.refresh();
ctx.start();
ctx.close();
}
public final静态字符串INIT\u METHOD\u REGEX=“INIT METHOD=\”\\w+\”;
公共最终静态字符串DESTROY\u METHOD\u REGEX=“DESTROY METHOD=\”\\w+\”;
公共最终静态字符串属性\u REGEX=“\\$\\{[^\}]+\}”;
private static List subs=new ArrayList();
静止的{
add(Arrays.asList(新字符串[]{INIT_METHOD_REGEX,“}));
add(Arrays.asList(新字符串[]{DESTROY_METHOD_REGEX,“}));
add(Arrays.asList(新字符串[]{PROPERTY_REGEX,“}));
}
静态公共void testSpringConfig(字符串配置文件)引发IOException{
URL springXml=Thread.currentThread().getContextClassLoader().getResource(配置文件);
InputStream=springXml.openStream();
字节[]缓冲区=新字节[8192];
int读取字节;
ByteArrayOutputStream bas=新的ByteArrayOutputStream();
而((readBytes=is.read(buffer))!=-1)
写入(缓冲区,0,读取字节);
字符串内容=baos.toString();
对于(列表s:SUB)
content=content.replaceAll(s.get(0),s.get(1));
ByteArrayInputStream bais=新的ByteArrayInputStream(content.getBytes());
InputSource isrc=新的InputSource(BAI);
GenericaApplicationContext ctx=新的GenericaApplicationContext();
XmlBeanDefinitionReader xmlReader=新的XmlBeanDefinitionReader(ctx);
setValidationMode(XmlBeanDefinitionReader.VALIDATION\u NONE);
加载BeanDefinitions(isrc);
ctx.refresh();
ctx.start();
ctx.close();
}
决定回答我自己的问题以分享找到的解决方案。不喜欢在没有init方法的情况下维护另一个配置文件副本的解决方案。我的解决方案并不完美,但能完成任务
public final static String INIT_METHOD_REGEX = "init-method=\"\\w+\"";
public final static String DESTROY_METHOD_REGEX = "destroy-method=\"\\w+\"";
public final static String PROPERTY_REGEX = "\\$\\{[^\\}]+\\}";
private static List<List<String>> subs = new ArrayList<List<String>>();
static {
subs.add(Arrays.asList( new String[] { INIT_METHOD_REGEX, "" }));
subs.add(Arrays.asList( new String[] { DESTROY_METHOD_REGEX, "" }));
subs.add(Arrays.asList( new String[] { PROPERTY_REGEX, "" }));
}
static public void testSpringConfig(String configFile) throws IOException {
URL springXml = Thread.currentThread().getContextClassLoader().getResource(configFile);
InputStream is = springXml.openStream();
byte[] buffer = new byte[8192];
int readBytes;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
while ((readBytes = is.read(buffer)) != -1)
baos.write(buffer, 0, readBytes);
String content = baos.toString();
for (List<String> s : subs)
content = content.replaceAll(s.get(0), s.get(1));
ByteArrayInputStream bais = new ByteArrayInputStream(content.getBytes());
InputSource isrc = new InputSource(bais);
GenericApplicationContext ctx = new GenericApplicationContext();
XmlBeanDefinitionReader xmlReader = new XmlBeanDefinitionReader(ctx);
xmlReader.setValidationMode(XmlBeanDefinitionReader.VALIDATION_NONE);
xmlReader.loadBeanDefinitions(isrc);
ctx.refresh();
ctx.start();
ctx.close();
}
public final静态字符串INIT\u METHOD\u REGEX=“INIT METHOD=\”\\w+\”;
公共最终静态字符串DESTROY\u METHOD\u REGEX=“DESTROY METHOD=\”\\w+\”;
公共最终静态字符串属性\u REGEX=“\\$\\{[^\}]+\}”;
private static List subs=new ArrayList();
静止的{
add(Arrays.asList(新字符串[]{INIT_METHOD_REGEX,“}));
add(Arrays.asList(新字符串[]{DESTROY_METHOD_REGEX,“}));
add(Arrays.asList(新字符串[]{PROPERTY_REGEX,“}));
}
静态公共void testSpringConfig(字符串配置文件)引发IOException{
URL springXml=Thread.currentThread().getContextClassLoader().getResource(配置文件);
InputStream=springXml.openStream();
字节[]缓冲区=新字节[8192];
int读取字节;
ByteArrayOutputStream bas=新的ByteArrayOutputStream();
而((readBytes=is.read(buffer))!=-1)
写入(缓冲区,0,读取字节);
字符串内容=baos.toString();
对于(列表s:SUB)
content=content.replaceAll(s.get(0),s.get(1));
ByteArrayInputStream bais=新的ByteArrayInputStream(content.getBytes());
InputSource isrc=新的InputSource(BAI);
GenericaApplicationContext ctx=新的GenericaApplicationContext();
XmlBeanDefinitionReader xmlReader=新的XmlBeanDefinitionReader(ctx);
setValidationMode(XmlBeanDefinitionReader.VALIDATION\u NONE);
加载BeanDefinitions(isrc);
ctx.refresh();
ctx.start();
ctx.close();
}
这是单元测试还是集成测试?如果是单元测试,那么不应该加载上下文,因此不需要担心init方法。如果是集成测试,我指的是任何