Reputation: 70
I am trying to test my code in spring boot but I catch
java.lang.NullPointerException
exception when I run my code. here are my Models:
package com.Loyalty.OpenLoyalty.Models.User;
import org.hibernate.annotations.DynamicUpdate;
import org.hibernate.annotations.GenericGenerator;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import javax.persistence.*;
import javax.swing.text.StyledEditorKit;
import java.sql.Timestamp;
import java.util.HashSet;
import java.util.Set;
@Entity
@Table(name = "ol__user")
@DynamicUpdate
@EntityListeners(AuditingEntityListener.class)
public class ol__user {
public ol__user() {
}
public ol__user(String first_name, String last_name, String Email, String username, String password, String dtype, Boolean is_active,ol__roles role,String salt,Timestamp create_at){
super();
this.first_name=first_name;
this.last_name=last_name;
this.password=password;
this.email=Email;
this.is_active=is_active;
this.username=username;
this.dtype=dtype;
this.role=role;
this.salt=salt;
this.create_at=create_at;
}
@Id
@GeneratedValue(strategy = GenerationType.AUTO, generator = "system-uuid")
@GenericGenerator(name = "system-uuid", strategy = "uuid")
@Column(name = "id", unique = true, nullable = false)
private String id;
@Column(name = "username", nullable = true)
private String username;
@Column(name = "password", nullable = false)
private String password;
@Column(name = "salt", nullable = true)
private String salt;
@Column(name = "is_active", nullable = false)
private Boolean is_active;
@Column(name = "create_at", nullable = true)
private Timestamp create_at;
@Column(name = "email", nullable = false)
private String email;
@Column(name = "password_requested_at", nullable = true)
private Timestamp password_requested_at;
@Column(name = "confirmation_token", nullable = true)
private String confirmation_token;
@Column(name = "deleted_at", nullable = true)
private Timestamp deleted_at;
@Column(name = "last_login_at", nullable = true)
private Timestamp last_login_at;
@Column(name = "dtype", nullable = false)
private String dtype;
@Column(name = "temporary_password_set_at", nullable = true)
private Timestamp temporary_password_set_at;
@Column(name = "action_token", nullable = true)
private String action_token;
@Column(name = "referral_customer_email", nullable = true)
private String referral_customer_email;
@Column(name = "newsletter_used_flag", nullable = true)
private Boolean newsletter_used_flag;
@Column(name = "phone", nullable = true)
private String phone;
@Column(name = "status_type", nullable = true)
private String status_type;
@Column(name = "status_state", nullable = true)
private String status_state;
@Column(name = "first_name", nullable = true)
private String first_name;
@Column(name = "last_name", nullable = true)
private String last_name;
@Column(name = "external", nullable = true)
private Boolean external;
@Column(name = "api_key", nullable = true)
private String api_key;
@Column(name = "allow_point_transfer", nullable = true)
private Boolean allow_point_transfer;
@ManyToOne(cascade = {CascadeType.ALL})
@JoinTable(name="ol__users_roles",
joinColumns={@JoinColumn(name="user_id")},
inverseJoinColumns={@JoinColumn(name="role_id")})
private ol__roles role;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getSalt() {
return salt;
}
public void setSalt(String salt) {
this.salt = salt;
}
public Boolean getIs_active() {
return is_active;
}
public void setIs_active(Boolean is_active) {
this.is_active = is_active;
}
public Timestamp getCreate_at() {
return create_at;
}
public void setCreate_at(Timestamp create_at) {
this.create_at = create_at;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public Timestamp getPassword_requested_at() {
return password_requested_at;
}
public void setPassword_requested_at(Timestamp password_requested_at) {
this.password_requested_at = password_requested_at;
}
public String getConfirmation_token() {
return confirmation_token;
}
public void setConfirmation_token(String confirmation_token) {
this.confirmation_token = confirmation_token;
}
public Timestamp getDeleted_at() {
return deleted_at;
}
public void setDeleted_at(Timestamp deleted_at) {
this.deleted_at = deleted_at;
}
public Timestamp getLast_login_at() {
return last_login_at;
}
public void setLast_login_at(Timestamp last_login_at) {
this.last_login_at = last_login_at;
}
public String getDtype() {
return dtype;
}
public void setDtype(String dtype) {
this.dtype = dtype;
}
public Timestamp getTemporary_password_set_at() {
return temporary_password_set_at;
}
public void setTemporary_password_set_at(Timestamp temporary_password_set_at) {
this.temporary_password_set_at = temporary_password_set_at;
}
public String getAction_token() {
return action_token;
}
public void setAction_token(String action_token) {
this.action_token = action_token;
}
public String getReferral_customer_email() {
return referral_customer_email;
}
public void setReferral_customer_email(String referral_customer_email) {
this.referral_customer_email = referral_customer_email;
}
public Boolean getNewsletter_used_flag() {
return newsletter_used_flag;
}
public void setNewsletter_used_flag(Boolean newsletter_used_flag) {
this.newsletter_used_flag = newsletter_used_flag;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getStatus_type() {
return status_type;
}
public void setStatus_type(String status_type) {
this.status_type = status_type;
}
public String getStatus_state() {
return status_state;
}
public void setStatus_state(String status_state) {
this.status_state = status_state;
}
public String getFirst_name() {
return first_name;
}
public void setFirst_name(String first_name) {
this.first_name = first_name;
}
public String getLast_name() {
return last_name;
}
public void setLast_name(String last_name) {
this.last_name = last_name;
}
public Boolean getExternal() {
return external;
}
public void setExternal(Boolean external) {
this.external = external;
}
public String getApi_key() {
return api_key;
}
public void setApi_key(String api_key) {
this.api_key = api_key;
}
public Boolean getAllow_point_transfer() {
return allow_point_transfer;
}
public void setAllow_point_transfer(Boolean allow_point_transfer) {
this.allow_point_transfer = allow_point_transfer;
}
public ol__roles getRoles() {
return role;
}
public void setRoles(ol__roles role) {
this.role = role;
}
}
and
package com.Loyalty.OpenLoyalty.Models.User.Projections;
import com.Loyalty.OpenLoyalty.Models.User.ol__user;
import java.util.ArrayList;
import java.util.List;
public class ol__users {
private List<ol__user> usersList;
public List<ol__user> getUsersList(){
if (usersList== null){
usersList=new ArrayList<>();
}
return usersList;
}
public void setUsersList(List<ol__user> usersList){
this.usersList= usersList;
}
}
my controller:
@GetMapping("/admin")
public ol__users getAllAdminUsers( ){
return userService.getAllAdminUsers();
}
My Service:
@Service
public class userService {
@Autowired
private userRepository userRepository;
public ol__users getAllAdminUsers( ){
ol__users response = new ol__users();
ArrayList<ol__user> list=new ArrayList<>();
userRepository.find
Bydtype("admin").forEach(e ->list.add(e));
response.setUsersList(list);
return response;
}
}
and my repository:
@Repository
public interface userRepository extends JpaRepository<ol__user, String> {
List<ol__user> findBydtype(String dtype);
Optional<ol__user> findById(String id);
Boolean existsByUsername(String username);
ol__user findByUsername(String username);
ol__user findByEmail(String username);
ol__user findByEmailIgnoreCase(String email);
// @Query(value = "select count(*) as count from ol__user",nativeQuery = true)
}
and finally here is my test code:
ExtendWith(MockitoExtension.class)
@RunWith(MockitoJUnitRunner.class)
public class Ol_userControllerTest {
@InjectMocks
Ol__userController Ol__userController;
@Mock
userRepository userRepository;
@Mock
userService userService;
@Test
@Transactional
public void testFindAll(){
ol__roles role=new ol__roles();
role.setName("tests");
role.setRole("Admin");
role.setIs_master(true);
Timestamp currentSqlTimestamp = new Timestamp(System.currentTimeMillis());
ol__user user1=new ol__user("anteaaa","nejatiaan","[email protected]","anteaaaaa","12345","admin",true,role,"123",currentSqlTimestamp);
ol__user user2=new ol__user("Nooria","Rajaee","[email protected]","Nooriaa","12345","admin",true,role,"123",currentSqlTimestamp);
List<ol__user> list = new ArrayList<ol__user>();
list.addAll(Arrays.asList(user1,user2));
Mockito.when(userRepository.findBydtype(any())).thenReturn(list);
//when
ol__users result = userService.getAllAdminUsers();
//then
assertThat(result.getUsersList().size()).isEqualTo(2);
assertThat(result.getUsersList().get(0).getFirst_name())
.isEqualTo(user1.getFirst_name());
}
}
I have debuted my code and I understood that
Mockito.when(userRepository.findBydtype(any())).thenReturn(list);
stores list in it but then in the next line my result object returns null and then the exception happens. I wonder where my problem is?
Upvotes: 0
Views: 1056
Reputation: 4857
Yes because you are testing the controller and injected mock to the controller, so the service in the controller is mocked and getAllAdminUsers()
returns null.
you should write a test for the controller and another for service
ExtendWith(MockitoExtension.class)
@RunWith(MockitoJUnitRunner.class)
public class ControllerTest {
@InjectMocks
private Ol__userController Ol__userController;
@Mock
private userRepository userRepository;
@Mock
private userService userService;
@Test
public void testFindAll(){
// Arrange
ol__roles role=new ol__roles();
role.setName("tests");
role.setRole("Admin");
role.setIs_master(true);
Timestamp currentSqlTimestamp = new Timestamp(System.currentTimeMillis());
ol__user user1=new ol__user("anteaaa","nejatiaan","[email protected]","anteaaaaa","12345","admin",true,role,"123",currentSqlTimestamp);
ol__user user2=new ol__user("Nooria","Rajaee","[email protected]","Nooriaa","12345","admin",true,role,"123",currentSqlTimestamp);
List<ol__user> list = new ArrayList<ol__user>();
list.addAll(Arrays.asList(user1,user2));
Mockito.when(ol__users result = userService.getAllAdminUsers()
).thenReturn(list);
// Act
List<ol__user> actual = Ol__userController.getAllAdminUsers();
// Assert
assertThat(actual.getUsersList().size()).isEqualTo(2);
assertThat(actual.getUsersList().get(0).getFirst_name())
.isEqualTo(user1.getFirst_name());
}
}
, Service test
ExtendWith(MockitoExtension.class)
@RunWith(MockitoJUnitRunner.class)
public class ServiceTest {
@InjectMocks
private userService userService;
@Mock
private userRepository userRepository;
@Test
public void testFindAll(){
// Arrange
ol__roles role=new ol__roles();
role.setName("tests");
role.setRole("Admin");
role.setIs_master(true);
Timestamp currentSqlTimestamp = new Timestamp(System.currentTimeMillis());
ol__user user1=new ol__user("anteaaa","nejatiaan","[email protected]","anteaaaaa","12345","admin",true,role,"123",currentSqlTimestamp);
ol__user user2=new ol__user("Nooria","Rajaee","[email protected]","Nooriaa","12345","admin",true,role,"123",currentSqlTimestamp);
List<ol__user> list = new ArrayList<ol__user>();
list.addAll(Arrays.asList(user1,user2));
when(userRepository.findBydtype(any())).thenReturn(list);
// Act
ol__users result = userService.getAllAdminUsers();
//Assert
assertThat(result.getUsersList().size()).isEqualTo(2);
assertThat(result.getUsersList().get(0).getFirst_name())
.isEqualTo(user1.getFirst_name());
}
}
Upvotes: 1