我得到这个运行时错误,我的用户是空的,从Junit和mockito测试结果,但它是工作完全正常,当我运行我的应用程序

flseospp  于 2023-03-30  发布在  其他
关注(0)|答案(1)|浏览(116)
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.

qxsslcnc

qxsslcnc1#

由于您的userRepository是mocked的,执行userRepository.save(user);将不起作用。

String email = "test@example.com";
User user = User.builder()
            .firstName("Test")
            .lastName("User")
            .email(email)
            .password("password")
            .role(Role.USER)
            .enabled(true)
            .build();

Mockito.when(userRepository.findByEmail(email)).thenReturn(user);

相关问题