2017-12-17 28 views
-2

データベースからユーザーリストを返す簡単なSpringブートRestアプリケーションがあります。 アプリケーションは正常に動作しますが、テストシナリオはエラーで失敗します。長いグーグルの後に理由を理解できない? テストクラスはuserRepositoryにアクセスできず、userRepository.getAllUsersを呼び出すのではなく、AppController.getAllUsersを呼び出しているようです。jUnitテストがNullPointerExceptionを返す理由が見つかりません

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.NullPointerException 
…………………………… 
Caused by: java.lang.NullPointerException 
    at com.loan.demo.controller.AppController.getAllUsers(AppController.java:43) 
………………………………………….. 

これらは私のクラスである: LoanAppApplication

@SpringBootApplication 
public class LoanAppApplication { 
public static void main(String[] args) { 
    SpringApplication.run(LoanAppApplication.class, args); 
} 
} 

クラスUser.java

@Entity 
@Table(name="USERTABLE") 
public class User { 
private int id; 
@NotNull 
private String firstName; 
@NotNull 
private String lastName; 
@NotNull 
private String persID; 
private int blocked; 
private Set<Loan> loans; 

public User() { 
} 
public User(String firstName, String lastName, String persID) { 
    this.firstName = firstName; 
    this.lastName = lastName; 
    this.persID = persID; 
} 

UserRepository:

@Repository 
public interface UserRepository extends JpaRepository<User, Integer>{ 
    public User findById(int Id); 
    public User findByPersID(String userId); 
} 

、残りコントローラ:

@RestController 
public class AppController { 

    @Autowired 
    UserRepository userRepository; 

    @GetMapping("/doit") 
    public String doIt() { 
     return "Do It"; 
    } 

    //list all users 
    @GetMapping("/users") 
    public List<User> getAllUsers() { 
     return userRepository.findAll(); // this is line 43 from debuging error log 
    } 
} 

とテストクラス:あなたは@BeforeでMock`sを初期化する必要が@Mockので、これを追加した後、あなたのuserRepository

@Mock 
UserRepository userRepository; 

を模擬する必要が

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(classes = {LoanAppApplication.class}) 
public class LoanAppApplicationTests { 

    private MockMvc mockMvc; 

    @InjectMocks 
    private AppController appController; 

    @Before 
    public void addData() { 
     mockMvc = MockMvcBuilders.standaloneSetup(appController) 
       .build(); 
    } 
    //First test scenario that return only string works perfectly 
    @Test 
    public void testData() throws Exception { 
     mockMvc.perform(get("/doit") 
       ) 
     .andExpect(status().isOk()) 
     .andExpect(content().string("Do It")); 
    } 
    //but second that should return empty json string fails with exception 
    @Test 
    public void testGet() throws Exception { 
     mockMvc.perform(get("/users") 
       ) 
     .andExpect(status().isOk()) 
     .andExpect(content().string("Do It")); //this test should fail but not return exception 
    } 
} 

答えて

1

MockitoAnnotations.initMocks(this); 

コード設定では、どのユーザーを取得したいのですか

User user = new User(); 
when(userRepository.getUsers()).thenReturn(Collections.singletonList(user)); 

、その後、あなたのアプリケーション・コンテキストは

+0

おかげで動作していないためである

verify(userRepository, times(1)).getUsers(); verifyNoMoreInteractions(userRepository); 

をチェックし、今では動作します。 – DD3

関連する問題