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裏面的功能進行單元測試覆蓋。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章