Java 来自服务层的单元测试CRUD方法的意外结果

Java 来自服务层的单元测试CRUD方法的意外结果,java,unit-testing,spring-boot,spring-mvc,junit,Java,Unit Testing,Spring Boot,Spring Mvc,Junit,我试图从我的服务层对crud方法进行单元测试,我已经编写了正确的代码(我想),但是AssertTrue给出了与我预期相反的结果。(java.lang.AssertionError:) 我的测试代码如下所示: 学生服务测试 @RunWith(SpringJUnit4ClassRunner.class) @ActiveProfiles("test") @SpringBootTest public class StudentServiceTest { private static final

我试图从我的服务层对crud方法进行单元测试,我已经编写了正确的代码(我想),但是AssertTrue给出了与我预期相反的结果。(java.lang.AssertionError:)

我的测试代码如下所示:

学生服务测试

@RunWith(SpringJUnit4ClassRunner.class)
@ActiveProfiles("test")
@SpringBootTest
public class StudentServiceTest {

    private static final String STUDENT_NAME = "Henkie";

    @Autowired
    private StudentServiceImpl studentService;

    @Autowired
    private StudentRepository studentRepository;


    @Test
    public void createStudent(){
        //arrange
        Student student = new Student();
        student.setStudentName(STUDENT_NAME);
        studentService.save(student);

        List<Student> students = studentService.findAll();

        assertNotNull(students);
        assertTrue("created a student" ,students.contains(student));
    }
@RunWith(SpringJUnit4ClassRunner.class)
@ActiveProfiles(“测试”)
@春靴测试
公共班级学生服务测试{
私有静态最终字符串STUDENT\u NAME=“Henkie”;
@自动连线
私人学生服务impl studentService;
@自动连线
私立学校;私立学校;
@试验
公立学校学生(){
//安排
学生=新生();
student.setStudentName(学生名);
学生服务。保存(学生);
List students=studentService.findAll();
assertNotNull(学生);
assertTrue(“创建了一个学生”,students.contains(student));
}
学生服务

public interface StudentService {

    List<Student> findAll();

    Student save(Student student);

    Optional<Student> findById(Long id);

    void deleteById(Long id);

    Iterable<Student> findAllIteratable();      
}
公共接口学生服务{
列出findAll();
学生储蓄(学生);
可选的findById(长id);
void deleteById(长id);
Iterable findalReadable();
}
StudentServiceImpl

@Service
@RequiredArgsConstructor
public class StudentServiceImpl implements StudentService {

    @Autowired
    private final StudentRepository studentRepository;


    public List<Student> findAll() {
        return Lists.newArrayList(studentRepository.findAll());
    }    

    public Student save(Student student) {
        return studentRepository.save(student);
    }

    public Optional<Student> findById(Long id) {
        return studentRepository.findById(id);
    }

    public void deleteById(Long id) {
        studentRepository.deleteById(id);
    }

}
@服务
@所需参数构造函数
公共类StudentServiceImpl实现StudentService{
@自动连线
私人期末考试预备课程预备课程预备课程;
公共列表findAll(){
return list.newArrayList(studentRepository.findAll());
}    
公共学生储蓄(学生){
返回studentRepository.save(学生);
}
公共可选findById(长id){
return studentRepository.findById(id);
}
公共void deleteById(长id){
studentRepository.deleteById(id);
}
}
StudentRepository

public interface StudentRepository extends CrudRepository<Student, Long> {

}
公共界面StudentRepository扩展了crudepository{
}
调试完成后,学生被成功创建,并被添加到列表中Student@10172,并在学生列表中,将其保存在Student@10482.列表中以前的所有条目都是以前测试尝试的结果


遗憾的是,我无法发表评论,因为我没有代表,但是……如果你有学生,你将其添加到持久化对象中,然后读回,它出现在集合中。那么唯一真正需要问的问题是,你是否覆盖学生类中的哈希代码和相等值


否则contains将查找相同的对象,而不是学生的相同表示形式。

是的,如@Alex所述,您需要添加并覆盖
equals
hashCode
。我看到您使用的是
Lombok
,因此您只需在
学生
cla上添加
@Data
ss和您的测试将成功。感谢您的回复!遗憾的是,在我的学生课堂上添加@Data并没有改变任何事情。请参阅(关于
@Data
关于
@Entity
的原因可能是一个坏主意)和(关于实体如何编写
等于
hashCode
),好的@M.Deinum。