Spring Boot單元測試之服務層測試總結

bladestone發表於2019-03-27

引言

書接上回,上回介紹了基於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裡面的功能進行單元測試覆蓋。

相關文章