Java 单元测试中的Spring-Skip初始化方法

Java 单元测试中的Spring-Skip初始化方法,java,spring,Java,Spring,我希望在Junit测试用例中测试Spring配置,而不调用已配置bean上的init方法。我本可以根据测试用例中设置的系统属性对init方法进行编码以跳过实际工作,但我正在寻找更干净的解决方案。您的JUnit测试是否使用相同的Spring上下文配置文件?我猜答案是肯定的。。。如果您的测试使用备用的spring配置,那么它将简化问题 我使用过的最干净的方法之一利用了一些方便的注释,如: @RunWith(SpringJUnit4ClassRunner.class) @ContextConfigur

我希望在Junit测试用例中测试Spring配置,而不调用已配置bean上的init方法。我本可以根据测试用例中设置的系统属性对init方法进行编码以跳过实际工作,但我正在寻找更干净的解决方案。

您的JUnit测试是否使用相同的Spring上下文配置文件?我猜答案是肯定的。。。如果您的测试使用备用的spring配置,那么它将简化问题

我使用过的最干净的方法之一利用了一些方便的注释,如:

@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方法。如果是集成测试,我指的是任何