2016-10-26 6 views
0

私は春を使用してJavaで小さなアプリケーションを開発していますので、私は、このサービスがあります。私は、テストを実行したときに、私はこの例外を取得するのはなぜ@PostConstructメソッドのNULLポインタ例外?

@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)); 
    } 

} 

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 

} 

そして、このテストを?

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注釈を使用すると、すべての豆が正しく注入されているはずですか?

+0

NullPointerExceptionがアノテーションから来ていますか?その機能の中の何かからスローされる可能性があります。 – Matt1776

+1

@ Matt1776私が例外を受けている行を削除した場合、この行にヌルポインタがあります: 'blogRepository.save(userBlog);'。私はuserBlogがnullであり、そうでないかどうかをテストします。だから私は今、非常に混乱しています... –

+1

ここに入れたコードの一部ではないエラーは45行目で起こっています。その部分を貼り付けることはできますか? –

答えて

1

ここにはほとんどありません。まず第一に@InjectMocksは一般的に物事をより簡単にしますが、Mockitoは依存性注入フレームワークではないため、正しく動作することは保証されません。

第2に、@InjectMocksが正しく動作するためには、あなたのオブジェクトもすべて@Mockにして、注入しようとしているクラスを手動で作成する必要はありません。私はもうその事件を信じていませんが、mockitoの注文版では@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)); 
    } 

} 
1

のために働くかもしれません。 AccountServiceTestクラスでこれを行うことができます:

@Mock 
private BlogRepository blogRepositoryMock;