![](/img/trans.png)
[英]Invoke another bean's method in @PostConstruct raised a null pointer ex
[英]Null pointer exception on @PostConstruct method?
我正在使用Spring在Java中開發一個小型應用程序,因此我擁有以下服務:
public class AccountService implements UserDetailsService {
@Autowired
private AccountRepository accountRepository;
@Autowired
private BlogRepository blogRepository;
@Autowired
private ImageService imageService;
@PostConstruct
protected void initialize() throws IOException {
Account user = new Account("user", "demo", "ROLE_USER");
save(user);
Blog userBlog = new Blog("userBlog", true, user);
userBlog.setAvatar(imageService.createBlogAvatar(userBlog.getName()));
blogRepository.save(userBlog);
save(new Account("admin", "admin", "ROLE_ADMIN"));
}
// More methods
}
而這個測試:
@RunWith(MockitoJUnitRunner.class)
public class AccountServiceTest {
@InjectMocks
private AccountService accountService = new AccountService();
@Mock
private AccountRepository accountRepositoryMock;
@Test
public void shouldInitializeWithTwoDemoUsers() throws IOException {
// act
accountService.initialize();
// assert
verify(accountRepositoryMock, times(2)).save(any(Account.class));
}
}
為什么在運行測試時出現此異常?
shouldInitializeWithTwoDemoUsers(es.udc.fi.dc.fd.account.AccountServiceTest) Time elapsed: 0.016 sec <<< ERROR!
java.lang.NullPointerException: null
at es.udc.fi.dc.fd.account.AccountService.initialize(AccountService.java:45)
at es.udc.fi.dc.fd.account.AccountServiceTest.shouldInitializeWithTwoDemoUsers(AccountServiceTest.java:42)
使用@PostConstruct
批注,應該將所有bean注入正確嗎?
這里的東西很少。 首先, @InjectMocks
通常使事情變得容易,但是Mockito不是依賴項注入框架,因此不能保證其正常工作。
其次,為了使@InjectMocks
正常工作,您還需要@Mock
所有對象,而不是手動創建要注入的類。 我不相信這種情況了,但是在@Mocks
版本的順序中, @Mocks
的順序也很重要。
該代碼可能對您有用
@RunWith(MockitoJUnitRunner.class)
public class AccountServiceTest {
@Mock
private AccountRepository accountRepositoryMock;
@Mock
private BlogRepository blogRepository;
@Mock
private ImageService imageService;
@InjectMocks
private AccountService accountService ;
@Test
public void shouldInitializeWithTwoDemoUsers() throws IOException {
// act
accountService.initialize();
// assert
verify(accountRepositoryMock, times(2)).save(any(Account.class));
}
}
您需要模擬測試對象正在使用的所有依賴項。 您可能需要在AccountServiceTest類中執行此操作:
@Mock
private BlogRepository blogRepositoryMock;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.