欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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里面的功能进行单元测试覆盖。