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