Spring笔记04-使用Spring进行测试

4.1 标准测试注解和injecting fixture

Spring的一个特点是测试Component非常方便。

现在我们为BaseballGame创建BaseballGameTest。然后做测试:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public class BaseballGameTest {
private Game game;
private ApplicationContext ctx;

@Before
public void setUp() throws Exception {
ctx = new AnnotationConfigApplicationContext(AppConfig.class);
game = ctx.getBean("game", Game.class);
}

@Test
public void playGame() throws Exception {
String home = game.getHomeTeam().getName();
String away = game.getAwayTeam().getName();

String result = game.playGame();

assertTrue(result.contains(home) || result.contains(away));
}

@Test
public void testGetAndSetHomeTeam() throws Exception {
Team royals = ctx.getBean("royals", Team.class);
game.setHomeTeam(royals);
assertEquals(royals.getName(), game.getHomeTeam().getName());
}

}

这里每次测试的时候,都要调用一次setUp,也就是我们的ApplicationContext会被反复创建很多次,Spring提供了一些方法让ApplicationContext只执行一次。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
@RunWith(SpringJUnit4ClassRunner.class) //
@ContextConfiguration(classes = AppConfig.class) //
public class BaseballGameTest {
@Autowired //
private Game game;

@Autowired //
private ApplicationContext ctx;

@Test
public void playGame() throws Exception {
String home = game.getHomeTeam().getName();
String away = game.getAwayTeam().getName();

String result = game.playGame();

assertTrue(result.contains(home) || result.contains(away));
}

@Test
public void testGetAndSetHomeTeam() throws Exception {
Team royals = ctx.getBean("royals", Team.class);
game.setHomeTeam(royals);
assertEquals(royals.getName(), game.getHomeTeam().getName());
}
}

这里我们用@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration(classes = AppConfig.class)让我们可以直接用Bean和ApplicationContext

4.2 事务测试

事务测试是当测试完成后,所有的测试操作都会回滚。我们用@Transactional来表示事务测试。

1
2
3
4
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = AppConfig.class)
@Transactional
public class BaseballGameTest { ... }

还有@Commit的注解,表示会提交;@Rollback表示回滚;@AfterTransaction表示事务执行后再执行。

还有就是@DirtiesContext表示测试上下文会影响到应用中的上下文,当测试执行后重新加载应用的上下文。

我们看到Spring的事务测试和回滚机制非常棒,即使我们不用Spring也可以把它拿出来用于测试。