public String generateToken(String email) {
String token = UUID.randomUUID().toString();
User user = userRepository.findByEmail(email);
ConfirmationToken confirmationToken = new ConfirmationToken(token, LocalDateTime.now(), LocalDateTime.now().plusMinutes(15), user);
// System.out.println(confirmationToken);
confirmationTokenRepository.save(confirmationToken);
// ConfirmationToken confirmationToken1=confirmationTokenRepository.findByToken(token);
// System.out.println(confirmationToken1);
return token;
I am testing this method using Junit and mockito and the application is spring boot application.
@Mock
private UserRepository userRepository;
@Mock
private ConfirmationTokenRepository confirmationTokenRepository;
@InjectMocks
private UserServiceImpl underTest;
@BeforeEach
void setUp() {
MockitoAnnotations.openMocks(this);
}
@Test
void generateToken() {
String email = "test@example.com";
User user = User.builder()
.firstName("Test")
.lastName("User")
.email(email)
.password("password")
.role(Role.USER)
.enabled(true)
.build();
userRepository.save(user);
String token = underTest.generateToken(email);
ConfirmationToken confirmationToken =new ConfirmationToken(token,LocalDateTime.now(),LocalDateTime.now().plusMinutes(15), user);
ArgumentCaptor<ConfirmationToken> argumentCaptor= ArgumentCaptor.forClass(ConfirmationToken.class);
verify(confirmationTokenRepository, times(1)).save(argumentCaptor.capture());
ConfirmationToken capturedToken=argumentCaptor.getValue();
Assertions.assertThat(capturedToken).isEqualTo(confirmationToken);
This the test method i created for the service method provided before.
package com.example.RegAndLoginApi.Entity;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
import java.util.Collection;
import java.util.List;
@Entity
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Table(name = "UserDetails")
public class User implements UserDetails {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "user_id")
private Long id;
@Column(name = "Fname")
private String firstName;
@Column(name = "Lname")
private String lastName;
@Column(name = "Email")
private String email;
@Column(name = "Password")
private String password;
@Enumerated(EnumType.STRING)
private Role role;
@Column(name = "Enabled")
private Boolean enabled;
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
return List.of(new SimpleGrantedAuthority(role.name()));
}
@Override
public String getUsername() {
return email;
}
@Override
public boolean isAccountNonExpired() {
return true;
}
@Override
public boolean isAccountNonLocked() {
return true;
}
@Override
public boolean isCredentialsNonExpired() {
return true;
}
@Override
public boolean isEnabled() {
return true;
}
}
This is my user entity class.
package com.example.RegAndLoginApi.Entity;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.time.LocalDateTime;
import java.util.UUID;
@Entity
@Table(name = "ConfirmationToken")
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ConfirmationToken {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "tokenID")
private Long tokenId;
@Column(nullable = false)
private String token;
private LocalDateTime createdAt;
@Column(nullable = false)
private LocalDateTime expiresAt;
@OneToOne
@JoinColumn(
nullable = false,
name = "user_id"
)
private User user;
public ConfirmationToken(String token,
LocalDateTime createdAt,
LocalDateTime expiresAt,
User user) {
this.token = token;
this.createdAt = createdAt;
this.expiresAt = expiresAt;
this.user = user;
}
}
This is Confirmation token entity.
package com.example.RegAndLoginApi.Repository;
import com.example.RegAndLoginApi.Entity.ConfirmationToken;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface ConfirmationTokenRepository extends JpaRepository<ConfirmationToken, Long> {
ConfirmationToken findByToken(String token);
}
package com.example.RegAndLoginApi.Repository;
import com.example.RegAndLoginApi.Entity.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
User findByEmail(String email);
Boolean existsByEmail(String email);
}
These are my Jpa Repositories.
This is the test result.
org.opentest4j.AssertionFailedError: expected: ConfirmationToken(tokenId=null, token=e84c45ab-5728-4106-a2b1-50718452f05b, createdAt=2023-03-26T11:25:02.925294400, expiresAt=2023-03-26T11:40:02.926292200, user=User(id=null, firstName=Test, lastName=User, email=test@example.com, password=password, role=USER, enabled=true)) but was: ConfirmationToken(tokenId=null, token=e84c45ab-5728-4106-a2b1-50718452f05b, createdAt=2023-03-26T11:25:02.925294400, expiresAt=2023-03-26T11:40:02.925294400, user=null) Expected :ConfirmationToken(tokenId=null, token=e84c45ab-5728-4106-a2b1-50718452f05b, createdAt=2023-03-26T11:25:02.925294400, expiresAt=2023-03-26T11:40:02.926292200, user=User(id=null, firstName=Test, lastName=User, email=test@example.com, password=password, ...
Actual :ConfirmationToken(tokenId=null, token=e84c45ab-5728-4106-a2b1-50718452f05b, createdAt=2023-03-26T11:25:02.925294400, expiresAt=2023-03-26T11:40:02.925294400, user=null)
I am expecting the both and actual is the same. I am getting user as null and there are few milliseconds gap between expected and actual for expiredAt and CreatedAt.
Here is the console output when i printed out both in my console while running my spring boot application.
ConfirmationToken(tokenId=null, token=c780e62d-d043-44c7-bc21-003a6298e592, createdAt=2023-03-26T11:30:39.299640100, expiresAt=2023-03-26T11:45:39.299640100, user=User(id=9, firstName=Surya, lastName=Kiran, email=suriyakiran@gmail.com, password=$2a$10$x9pZBcHyB0Jz05jzZm62g.tu5hcgvs.0oOnd0DugO0b8297ZiS4Ri, role=USER, enabled=false))
ConfirmationToken(tokenId=7, token=c780e62d-d043-44c7-bc21-003a6298e592, createdAt=2023-03-26T11:30:39.299640100, expiresAt=2023-03-26T11:45:39.299640100, user=User(id=9, firstName=Surya, lastName=Kiran, email=suriyakiran@gmail.com, password=$2a$10$x9pZBcHyB0Jz05jzZm62g.tu5hcgvs.0oOnd0DugO0b8297ZiS4Ri, role=USER, enabled=false))
Here both are exactly same.
I need help to solve this issue.
1条答案
按热度按时间qxsslcnc1#
由于您的userRepository是mocked的,执行
userRepository.save(user);
将不起作用。