簡體   English   中英

@PostConstruct方法上的空指針異常?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM