既然我們現在開發的是一個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);
}
}
在上面的原始碼裡我們要注意三點:
-
測試類繼承了AbstractTestNGSpringContextTests,如果不這麼做測試類是無法啟動Spring容器的
-
使用了@ContextConfiguration來載入被測試的Bean:
FooServiceImpl
-
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 {
}
@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
掃描到,從而產生一些奇怪的問題。