Back to Repositories

Testing Spring Data JPA Repository Operations in spring-boot-examples

This test suite validates the functionality of UserDetail and Address repositories in a Spring Boot JPA application. It covers basic CRUD operations and complex user information retrieval, demonstrating the integration between different data models.

Test Coverage Overview

The test suite provides comprehensive coverage of repository operations including:
  • Address entity persistence testing
  • UserDetail creation and storage validation
  • Complex user information retrieval using custom queries
  • Integration between User, UserDetail, and Address entities
Edge cases and data integrity are verified through various data combinations and relationships.

Implementation Analysis

The testing approach utilizes Spring Boot’s testing framework with JUnit 4 integration. The implementation follows a repository pattern with Spring Data JPA, leveraging annotations like @RunWith(SpringRunner.class) and @SpringBootTest for proper Spring context initialization.

Repository injection is handled through @Resource annotation, demonstrating proper dependency management.

Technical Details

Testing tools and configuration include:
  • JUnit 4 test framework
  • Spring Boot Test context
  • Spring Data JPA repositories
  • Resource injection for repository access
  • Date formatting utilities for timestamp handling
  • Custom query methods for complex data retrieval

Best Practices Demonstrated

The test suite exemplifies several testing best practices:
  • Proper test method isolation and naming
  • Clear separation of concerns between different repository tests
  • Effective use of Spring Boot testing annotations
  • Structured data model validation
  • Comprehensive entity relationship testing

ityouknow/spring-boot-examples

2.x/spring-boot-jpa/spring-boot-jpa/src/test/java/com/neo/repository/UserDetailRepositoryTests.java

            
package com.neo.repository;

import com.neo.model.Address;
import com.neo.model.User;
import com.neo.model.UserDetail;
import com.neo.model.UserInfo;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.test.context.junit4.SpringRunner;

import javax.annotation.Resource;
import java.text.DateFormat;
import java.util.Date;
import java.util.List;

@RunWith(SpringRunner.class)
@SpringBootTest
public class UserDetailRepositoryTests {

	@Resource
	private AddressRepository addressRepository;
	@Resource
	private UserDetailRepository userDetailRepository;

	@Test
	public void testSaveAddress() {
		Address address=new Address();
		address.setUserId(1L);
		address.setCity("北京");
		address.setProvince("北京");
		address.setStreet("分钟寺");
		addressRepository.save(address);
	}

	@Test
	public void testSaveUserDetail() {
		Date date = new Date();
		DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG);
		String formattedDate = dateFormat.format(date);
		UserDetail userDetail=new UserDetail();
		userDetail.setUserId(3L);
		userDetail.setHobby("吃鸡游戏");
		userDetail.setAge(28);
		userDetail.setIntroduction("一个爱玩的人");
		userDetailRepository.save(userDetail);
	}

	@Test
	public void testUserInfo()  {
		List<UserInfo> userInfos=userDetailRepository.findUserInfo("钓鱼");
		for (UserInfo userInfo:userInfos){
			System.out.println("userInfo: "+userInfo.getUserName()+"-"+userInfo.getEmail()+"-"+userInfo.getHobby()+"-"+userInfo.getIntroduction());
		}
	}
}