繁体   English   中英

春季-跳过单元测试中的初始化方法

[英]Spring - Skip init-method in unit test

我想在Junit测试用例中测试Spring配置,而无需在配置的bean上调用init-method。 我本可以对自己的初始化方法进行编码,以根据可以在测试用例中设置的系统属性跳过实际工作,但我正在寻找一种更干净的解决方案。

您的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不同的上下文XML来运行测试?

您可能有点老套了,并扩展了要测试的类并覆盖了init方法。

或者,您可以稍微重构一下并注入init方法使用的init策略对象。

我更喜欢testContext.xml的方式...

决定回答我自己的问题,以分享找到的解决方案。 不喜欢在没有初始化方法的情况下维护配置文件的另一个副本的解决方案。 我的解决方案并不完美,但是可以完成工作。

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();
}

这是单元测试还是集成测试? 如果是单元测试,那么您不应该加载上下文,因此您不必担心init方法。 如果是集成测试(我的意思是任何可以验证几个类之间的交互作用的测试),则需要确保确实调用了init方法以确保有效测试。

虽然如此,上一章打在了头上,使用了不调用init方法的不同上下文。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM