Spring Boot单元测试之服务层测试总结
程序员文章站
2022-04-26 09:18:03
...
引言
书接上回,上回介绍了基于Controller层的测试用例,本节将介绍基于服务层的测试用例用法。
基于Controller层文章,请参阅: Spring Boot之单元测试用例
基于Service服务层的单元测试
服务层主要定义各类的业务逻辑,调用DAO层的各类数据服务,完成相应的业务操作。
定义服务的示例:
@Service
@Slf4j
public class GameService {
@Autowired
private GameRepository gameRepository;
public Game getGame(String name) {
if (StringUtils.isEmpty(name)) {
return new Game();
}
GameEntity gameEntity = this.gameRepository.findByName(name);
Game game = new Game();
game.setId(gameEntity.getId());
game.setName(gameEntity.getName());
return game;
}
}
在上述服务类中,依赖GameRepository的数据服务,其中进行查询,并返回对应的Game实例。
GameRepository的类定义如下:
@Repository
public interface GameRepository extends JpaRepository<GameEntity, Long> {
public GameEntity findByName(String name);
}
DAO的实体Entity定义如下:
@Entity
@Data
public class GameEntity {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long id;
@Column
private String name;
@Column
@Temporal(TemporalType.TIMESTAMP)
private Date createdTime;
}
上述为实体Entity类的定义。
基于Service的单元测试示例
测试类如下:
@Slf4j
@RunWith(SpringRunner.class)
public class GameServiceTest {
@TestConfiguration
static class GameServiceTestContextConfiguration {
@Bean
public GameService gameService() {
return new GameService();
}
}
@Autowired
private GameService gameService;
@MockBean
private GameRepository gameRepository;
private String name;
@Before
public void setUp() {
this.name = "Great";
GameEntity gameEntity = new GameEntity();
gameEntity.setId(1l);
gameEntity.setName("Great");
gameEntity.setCreatedTime(new Date());
given(gameRepository.findByName(name)).willReturn(gameEntity);
}
@Test
public void testGetByName() {
Game game = this.gameService.getGame(name);
Assert.assertEquals(name + " is not equal", name, game.getName());
}
}
这里使用given给GameRepository实例进行了赋值操作。最终以判断结果字符串是否相等来简单示意如何来进行相关操作。
关于使用到的注解
@TestConfiguration是在Spring Boot Test中提供一个辅助工具,用来定义类似@Configuration或者自定义的配置功能,在其中可以声明所需的实体Bean。其基本上是作为@Configuration的一个测试补充。 在Spring Boot应用中,由其@TestConfiguration定义的实体Bean将会被忽略,自动排除在外。
总结
这里举出的例子是针对单个Service层面的接口来做的,需要通过given()方式给相关的依赖类进行赋值,然后针对Service里面的功能进行单元测试覆盖。