• Chapter 1: 基本用法 - 使用Spring Testing工具
    • 例子1
    • 例子2
    • 例子3
    • 参考文档

    Chapter 1: 基本用法 - 使用Spring Testing工具

    既然我们现在开发的是一个Spring项目,那么肯定会用到Spring Framework的各种特性,这些特性实在是太好用了,它能够大大提高我们的开发效率。那么自然而然,你会想在测试代码里也能够利用Spring Framework提供的特性,来提高测试代码的开发效率。这部分我们会讲如何使用Spring提供的测试工具来做测试。

    例子1

    源代码见FooServiceImplTest:

    1. @ContextConfiguration(classes = FooServiceImpl.class)
    2. public class FooServiceImplTest extends AbstractTestNGSpringContextTests {
    3. @Autowired
    4. private FooService foo;
    5. @Test
    6. public void testPlusCount() throws Exception {
    7. assertEquals(foo.getCount(), 0);
    8. foo.plusCount();
    9. assertEquals(foo.getCount(), 1);
    10. }
    11. }

    在上面的源代码里我们要注意三点:

    1. 测试类继承了AbstractTestNGSpringContextTests,如果不这么做测试类是无法启动Spring容器的
    2. 使用了[@ContextConfiguration][javadoc-ContextConfiguration]来加载被测试的Bean:FooServiceImpl
    3. FooServiceImpl@Component

    以上三点缺一不可。

    例子2

    在这个例子里,我们将@Configuration作为nested static class放在测试类里,根据@ContextConfiguration的文档,它会在默认情况下查找测试类的nested static @Configuration class,用它来导入Bean。

    源代码见FooServiceImplTest:

    1. @ContextConfiguration
    2. public class FooServiceImplTest extends AbstractTestNGSpringContextTests {
    3. @Autowired
    4. private FooService foo;
    5. @Test
    6. public void testPlusCount() throws Exception {
    7. assertEquals(foo.getCount(), 0);
    8. foo.plusCount();
    9. assertEquals(foo.getCount(), 1);
    10. }
    11. @Configuration
    12. @Import(FooServiceImpl.class)
    13. static class Config {
    14. }
    15. }

    例子3

    在这个例子里,我们将@Configuration放到外部,并让@ContextConfiguration去加载。

    源代码见Config:

    1. @Configuration
    2. @Import(FooServiceImpl.class)
    3. public class Config {
    4. }

    FooServiceImplTest:

    1. @ContextConfiguration(classes = Config.class)
    2. public class FooServiceImplTest extends AbstractTestNGSpringContextTests {
    3. @Autowired
    4. private FooService foo;
    5. @Test
    6. public void testPlusCount() throws Exception {
    7. assertEquals(foo.getCount(), 0);
    8. foo.plusCount();
    9. assertEquals(foo.getCount(), 1);
    10. }
    11. }

    需要注意的是,如果@Configuration是专供某个测试类使用的话,把它放到外部并不是一个好主意,因为它有可能会被@ComponentScan扫描到,从而产生一些奇怪的问题。

    参考文档

    • Spring Framework Testing
    • Context configuration with annotated classes