当前位置: 首页 > 知识库问答 >
问题:

Spring数据测试-两个相同的对象返回另外两个hashcode

汪甫
2023-03-14

我试图通过@datajpatest测试我的Spring存储库。我想通过电子邮件找到完全相同的用户,但我得到了另一个角色集。

首先,如果我开始我的项目,然后我设置测试用户和他的角色。

@Component
@RequiredArgsConstructor
public class SetupDataLoader implements ApplicationListener<ContextRefreshedEvent> {

private final UserRepository userRepository;
private final RoleRepository roleRepository;
private final UserService userService;
boolean alreadySetup = false;

@Override
@Transactional
public void onApplicationEvent(ContextRefreshedEvent event) {

    if (alreadySetup)
        return;

    createRoleIfNotFound("ROLE_USER");
    createRoleIfNotFound("ROLE_ADMIN");

    if (userRepository.findByUsername("test123") == null) {
        UserRegistrationDto user = new UserRegistrationDto();
        user.setUsername("test123");
        user.setPassword("Test12345");
        user.setEmail("test@test.com");
        userService.save(user);
    }

    alreadySetup = true;
}

@Transactional
Role createRoleIfNotFound(String name) {

    Role role = roleRepository.findByName(name);
    if (role == null) {
        role = roleRepository.save(new Role(name));
    }
    return role;
}

将保存用户的UserService中的一段代码。

public void save(UserRegistrationDto userRegistrationDto) {
    userValidator.userRegistrationValidator(userRegistrationDto);

    User user = new User();
    user.setUsername(userRegistrationDto.getUsername());
    user.setPassword(passwordEncoder.encode(userRegistrationDto.getPassword()));
    user.setEmail(userRegistrationDto.getEmail());
    user.setEnabled(true);
    Set<Role> roles = new HashSet<>();
    roles.add(roleRepository.findByName("ROLE_USER"));
    user.setRoles(roles);

    userRepository.save(user);
}
@DataJpaTest
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
class UserRepositoryTest {

@Autowired
private UserRepository testUserRepository;

@Autowired
private RoleRepository testRoleRepository;

@Test
void shouldFindUserByEmail() {
    //given
    Set<Role> roles = new HashSet<>();
    roles.add(testRoleRepository.findByName("ROLE_USER"));

    User user = new User();
    user.setId(1L);
    user.setUsername("test123");
    user.setPassword("$2a$10$Dk0CTgpWyqckt/UmSviLmOOYeqWpf4lFeuZcoLvW33LdZqRAYI2lW");
    user.setEmail("test@test.com");
    user.setRoles(roles);
    user.setEnabled(true);

    //when
    User userWithMail = testUserRepository.findByEmail("test@test.com");
    //then
    assertThat(userWithMail).isEqualTo(user);
}

在测试中比较对象是好主意,还是例如用户名/电子邮件就足够了?

共有1个答案

宇文弘懿
2023-03-14

assertThat(userWithMail).IsEqualTo(user);

您是否重写了user中的equals()方法?否则,Java默认为比较引用-在这种情况下,两个独立的对象总是不同的(new User().equals(new User())将返回false)。

如果您不想自己重写equals(),则可以在测试方法中查找进行字段比较的方法-AssertJ具有例如IsEqualToComparingFieldByField(),它应该返回true。

顺便说一句,它应该返回true,因为Sets定义equals()方法的方式确保具有完全相同内容的任何Set实现彼此相等。因此,Hibernate使用包装器实现并不重要,如果所有元素都匹配,PersistentSet将等于您的HashSet。好吧,如果元素确实匹配的话--这可能需要重写角色实体的equals()和hashCode()。

 类似资料:
  • 我有像下面这样的课。 我通过Restendpoint获取此对象。问题是,当字段passPayer和driver对象相等时,在返回的JSON中,driver字段只包含ID(它只是一个整数值),passPayer字段包含所有对象字段。 当这些字段具有不同的对象时,两个字段都显示如下所示的完整详细信息。 我需要两个对象都包含数据(字段。[id,firstName,lastName,idNo]),无论它们

  • 在一个表中有两列可以是来自同一表的外键,这样可以吗? 例如: 我有一个“address”表,表中有列: id,street,city_id,state,country(或id,street,city_id,state_id,state_id) 我有一个'states'表,保存状态和国家:id、name、level 那么我可以把states_id放在地址表的state和country中吗(如上面的括

  • 我的业务规则是,如果第一个、最后一个和中间字段都相等,或者如果第一个和最后一个字段相等,并且其中一个(或两个)对象的中间字段为null,则两个Name对象被视为相等。 因此,在为我的Name类实现hash和equals方法时,我可以使用这样的用例:equals为两个对象返回true,但这两个对象的hash返回不同的值(因为一个对象的middle值为null值,而另一个对象的middle值为null

  • 在MySQL中,我有3个表:Client、Room和ClientRoom,它指向前面的两个表。 使用python manage.py inspectdb 问题是,要创建ClientRoom对象,我需要Client和Room对象的id,而不是两个对象:一个Client和一个Room。 这对我来说是没有意义的,而且这也阻止了进一步的进展。我一直在做gui站点(在HTML上),它显示房间号,应该显示客户

  • 我有这两个类,它们都有一个项目列表,我试图返回一个新对象“ItemWithDiscount”,它具有这两个类的属性,这在服务/控制器申请中。我尝试用流映射它们,但没能做到。谁能给我一个简单的方法来做这件事吗?

  • 我在android工作室工作,2.1.2。 我在两个活动之间有一个神秘角色转换异常。 在第一个活动中,我有这个ArrayList: 我将arraylist(parcellable)插入到bundle中,以便在另一个活动中发送: 在第二个活动中,我将此用于恢复ArrayList 现在按照 我什么都试过了,带和不带Bundle的发送,类输出结束输出都是一样的,为什么要这样铸造呢?那我该怎么解决?? 谢