做程序员这个行业久了,可能都有过这样的体验,领导突然让你补以前完成的功能模块的测试代码。所以我就想能不能通过ds自动生成一个基本的测试代码,然后自己稍微调整一下,就能完成任务。
生成service层的测试代码
把前几天生成service层代码(具体参考前几天的那篇文章DeepSeek一键生成后端CRUD!从建表SQL到完整API的魔法实践),告诉deepseek,让它帮我生成junit5的测试代码,然后它就给我生成相应的service层测试代码。
@ExtendWith(MockitoExtension.class)
public class EmployeeServiceTest {
@Mock
private EmployeeRepository employeeRepository;
@InjectMocks
private EmployeeService employeeService;
private Employee employee1;
private Employee employee2;
private Date testDate;
@BeforeEach
void setUp() {
testDate = new Date();
//employee1 = new Employee(1, "John Doe", "Engineering", new BigDecimal("75000"), testDate);
employee1 = Employee.builder()
.id(1)
.name("John Doe")
.department("Engineering")
.salary(new BigDecimal("75000"))
.hireDate(testDate)
.build();
employee2 = Employee.builder()
.id(2)
.name("Jane Smith")
.department("Marketing")
.salary(new BigDecimal("65000"))
.hireDate(testDate)
.build();
}
@Test
void createEmployee_ShouldReturnSavedEmployee() {
when(employeeRepository.save(any(Employee.class))).thenReturn(employee1);
Employee created = employeeService.createEmployee(employee1);
assertThat(created).isEqualTo(employee1);
verify(employeeRepository).save(employee1);
}
@Test
void updateEmployee_WhenEmployeeExists_ShouldReturnUpdatedEmployee() {
when(employeeRepository.existsById(employee1.getId())).thenReturn(true);
when(employeeRepository.save(any(Employee.class))).thenReturn(employee1);
Employee updated = employeeService.updateEmployee(employee1);
assertThat(updated).isEqualTo(employee1);
verify(employeeRepository).existsById(employee1.getId());
verify(employeeRepository).save(employee1);
}
……
}
由于太长,我删除了部分测试方法,只展示部分测试方法和如何mock测试数据的关键部分,测试百分百通过,而且覆盖率可以达到百分百。(有可能我举得这个例子比较简单)
生成repository层测试代码
我又拿前几天生成得jpa层代码给ds代码,让它给我生成相关的代码。一开始ds给生成需要连接docker环境的测试代码。
@DataJpaTest
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
@Testcontainers
class EmployeeRepositoryMySQLTest {
@Container
static MySQLContainer<?> mysql = new MySQLContainer<>("mysql:8.0")
.withDatabaseName("testdb")
.withUsername("test")
.withPassword("test");
@DynamicPropertySource
static void configureProperties(DynamicPropertyRegistry registry) {
registry.add("spring.datasource.url", mysql::getJdbcUrl);
registry.add("spring.datasource.username", mysql::getUsername);
registry.add("spring.datasource.password", mysql::getPassword);
registry.add("spring.datasource.driver-class-name", mysql::getDriverClassName);
}
@Autowired
private EmployeeRepository employeeRepository;
由于我的mysql环境就在本地电脑上,也不存在docker环境。所以我告诉ds,让它生成连接本地mysql的测试代码,然后就修改成了这样
@DataJpaTest
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
public class EmployeeRepositoryMySQLTest {
@Autowired
private EmployeeRepository employeeRepository;
private Employee employee1;
private Employee employee2;
private Employee employee3;
private Date testDate;
static List oriEmployees = null;
@BeforeEach
void setUp() {
testDate = new Date();
oriEmployees = employeeRepository.findAll();
employeeRepository.deleteAll();
employee1 = Employee.builder()
.name("John Doe")
.department("Engineering")
.salary(new BigDecimal("75000"))
.hireDate(testDate)
.build();
employee2 = Employee.builder()
.name("Jane Smith")
.department("Marketing")
.salary(new BigDecimal("80000"))
.hireDate(new Date(testDate.getTime() - 86400000)) // Yesterday
.build();
employee3 = Employee.builder()
.name("Bob Johnson")
.department("Engineering")
.salary(new BigDecimal("70000"))
.hireDate(new Date(testDate.getTime() - 172800000)) // 2 days ago
.build();
employeeRepository.saveAll(List.of(employee1, employee2, employee3));
}
@Test
void findByDepartment_ShouldReturnEmployeesInDepartment() {
List<Employee> engineeringEmployees = employeeRepository.findByDepartment("Engineering");
assertThat(engineeringEmployees)
.hasSize(2)
.extracting(Employee::getName)
.containsExactlyInAnyOrder("John Doe", "Bob Johnson");
}
……
@AfterEach
void tearDown() {
employeeRepository.deleteAll();
employeeRepository.saveAll(oriEmployees);
}
同样由于篇幅有限,我只展示了部分测试代码和数据怎么setup并销毁的例子。同样测试百分百通过,并且覆盖率达百分百。
总结
AI是一个很好的帮我们提升效率的工具,但不是每次结果都能达到我们的预期,可以通过调整需求描述,再次告诉AI,让它生成更解决我们需求的代码。