Spring Boot单元测试之服务层测试总结

引言

书接上回,上回介绍了基于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里面的功能进行单元测试覆盖。

发布了478 篇原创文章 · 获赞 804 · 访问量 433万+

猜你喜欢

转载自blog.csdn.net/blueheart20/article/details/88852438