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裡面的功能進行單元測試覆蓋。
相關文章
- Spring Boot之DAO層的單元測試小結Spring Boot
- Spring Boot之單元測試用例總結Spring Boot
- Spring Boot 單元測試Spring Boot
- Mokito 單元測試與 Spring-Boot 整合測試Springboot
- 測試 之Java單元測試、Android單元測試JavaAndroid
- 使用 Spring Boot 進行單元測試Spring Boot
- Junit 單元測試使用總結
- 前端單元測試總結及測試工具介紹前端
- Spring Boot單元和整合測試概述 | rieckpilSpring BootKPI
- 測試開發之單元測試-禪道結合ZTF驅動單元測試執行
- Golang 單元測試 - 介面層Golang
- Spring Boot乾貨系列:(十二)Spring Boot使用單元測試Spring Boot
- Go 單元測試之mock介面測試GoMock
- Golang 單元測試 - 邏輯層Golang
- Golang 單元測試 - 資料層Golang
- 單元測試:單元測試中的mockMock
- 怎樣使用Spring Boot專案的單元測試Spring Boot
- 怎樣使用Spring Boot專案的單元測試?Spring Boot
- Java單元測試之junitJava
- android單元測試遇到問題總結Android
- 軟體工程單元測試作業總結軟體工程
- Go 單元測試之HTTP請求與API測試GoHTTPAPI
- Go 單元測試之Mysql資料庫整合測試GoMySql資料庫
- 前端測試:Part II (單元測試)前端
- spring boot 整合測試Spring Boot
- 使用 Spring 進行單元測試Spring
- Spring AOP單元測試綜合指南Spring
- 在Model層如何做單元測試?
- Spring、Spring Boot和TestNG測試指南 – 共享測試配置Spring Boot
- Java單元測試神器之MockitoJavaMockito
- Java單元測試技巧之PowerMockJavaMock
- Flutter 學習之路 - 測試(單元測試,Widget 測試,整合測試)Flutter
- [iOS單元測試系列]單元測試編碼規範iOS
- 單元測試 - 測試場景記錄
- 測試氣味-整潔單元測試
- 微服務測試之效能測試微服務
- Flutter 單元測試Flutter
- Go單元測試Go