Spring、Spring Boot和TestNG測試指南 – 使用Spring Testing工具

chanjarster發表於2017-07-21

Github地址

既然我們現在開發的是一個Spring專案,那麼肯定會用到Spring Framework的各種特性,這些特性實在是太好用了,它能夠大大提高我們的開發效率。那麼自然而然,你會想在測試程式碼裡也能夠利用Spring Framework提供的特性,來提高測試程式碼的開發效率。這部分我們會講如何使用Spring提供的測試工具來做測試。

例子1

原始碼見FooServiceImplTest

@ContextConfiguration(classes = FooServiceImpl.class)
public class FooServiceImplTest extends AbstractTestNGSpringContextTests {

  @Autowired
  private FooService foo;

  @Test
  public void testPlusCount() throws Exception {
    assertEquals(foo.getCount(), 0);

    foo.plusCount();
    assertEquals(foo.getCount(), 1);
  }

}

在上面的原始碼裡我們要注意三點:

  1. 測試類繼承了AbstractTestNGSpringContextTests,如果不這麼做測試類是無法啟動Spring容器的

  2. 使用了@ContextConfiguration來載入被測試的Bean:FooServiceImpl

  3. FooServiceImpl@Component

以上三點缺一不可。

例子2

在這個例子裡,我們將@Configuration作為nested static class放在測試類裡,根據@ContextConfiguration的文件,它會在預設情況下查詢測試類的nested static @Configuration class,用它來匯入Bean。

原始碼見FooServiceImplTest

@ContextConfiguration
public class FooServiceImplTest extends AbstractTestNGSpringContextTests {

  @Autowired
  private FooService foo;

  @Test
  public void testPlusCount() throws Exception {
    assertEquals(foo.getCount(), 0);

    foo.plusCount();
    assertEquals(foo.getCount(), 1);
  }

  @Configuration
  @Import(FooServiceImpl.class)
  static class Config {
  }

}

例子3

在這個例子裡,我們將@Configuration放到外部,並讓@ContextConfiguration去載入。

原始碼見Config

@Configuration
@Import(FooServiceImpl.class)
public class Config {
}

FooServiceImplTest

@ContextConfiguration(classes = Config.class)
public class FooServiceImplTest extends AbstractTestNGSpringContextTests {

  @Autowired
  private FooService foo;

  @Test
  public void testPlusCount() throws Exception {
    assertEquals(foo.getCount(), 0);

    foo.plusCount();
    assertEquals(foo.getCount(), 1);
  }

}

需要注意的是,如果@Configuration是專供某個測試類使用的話,把它放到外部並不是一個好主意,因為它有可能會被@ComponentScan掃描到,從而產生一些奇怪的問題。

參考文件

相關文章