我试图通过@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);
}
在测试中比较对象是好主意,还是例如用户名/电子邮件就足够了?
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的发送,类输出结束输出都是一样的,为什么要这样铸造呢?那我该怎么解决?? 谢