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

时间:2019-06-17 00:20:57

标签: java unit-testing spring-boot spring-mvc junit

我正在尝试对服务层中的crud方法进行单元测试,我编写了正确的代码(我认为),但是AssertTrue给了我所期望的相反结果。(java.lang.AssertionError:)

我的测试代码如下:

StudentServiceTest

@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));
    }

StudentService

public interface StudentService {

    List<Student> findAll();

    Student save(Student student);

    Optional<Student> findById(Long id);

    void deleteById(Long id);

    Iterable<Student> findAllIteratable();      
}

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);
    }

}

StudentRepository

public interface StudentRepository extends CrudRepository<Student, Long> {

}

调试后,可以看到该学生已成功完成,并且已添加到列表中。但是可以看到,它保存在Student @ 10172下,在学生列表中,它保存在Student @ 10482下。列表中所有先前的条目都是先前测试的结果。

enter image description here

1 个答案:

答案 0 :(得分:1)

由于我没有代表,所以我无法发表评论,但是...如果您有学生,则将其添加到持久对象中,然后您将其读回,并且它存在于集合中。那么,唯一真正要问的问题是,您是否覆盖哈希代码并在Student类中等于?

否则,包含将寻找相同的对象,而不是学生的相同表示。