2016-06-24 14 views
2

私はスプリングブートアプリケーションを開発中です。 サービスメソッドは、サービスでautowiredされているGridFsTemplateを使用してPDFをmongodbレポにアップロードします。 このファイルアップロードサービスメソッドは、postman rest clientを介して正常に動作します。 しかし、単体テストを実行しようとしたとき。同じサービスメソッドを呼び出すと、SpringData GridFsTemplateは初期化されません(MongoDBでは、バイナリファイルを格納するためにGridFSを使用できます)。これにより、org.springframework.data.mongodb.gridfs.GridFsTemplate.store(...)がNullPointerExceptionをスローします。 お元気ですか、私は数日間このことに固執しています。以下はGridFsTemplateサービスユニットテストクラスでのNullPointerException(Tech Stack:Spring Data/Spring Boot/Micro Service/Mongodb)

私のサービスの実装です:

@Service 
public final class UploadServiceImpl implements UploadService { 

    @Autowired 
    private SequenceRepository sequenceDao; 

    @Autowired (required = true) 
    private GridFsTemplate gridFsTemplate; 

    @Override 
    public Long uploadFile(Invoice uploadedInvoice) { 

     ByteArrayInputStream byteArrayInputStream = null; 

     if (checkContentType(invoiceInfo.getContentType())) { 

      invoiceInfo.setPaymentID(sequenceDao.getNextSequenceId(INVOICE_UPLOAD_SEQ_KEY)); 
      byteArrayInputStream = new ByteArrayInputStream(uploadedInvoice.getFileContent()); 

//Error thrown is java.lang.NullPointerException: null, where  gridFsTemplate is null and basically autowire does not work when test is  run. 

       GridFSFile gridFSUploadedFile=  gridFsTemplate.store(byteArrayInputStream, invoiceInfo.getFileName(),  invoiceInfo.getContentType(), invoiceInfo); 
       return 1l; 

     } else { 
      return 2l; 
     } 
    } 
###以下は、あなたのUploadServiceをautowireする@InjectMocksを使用しているため、問題があるサービス
@RunWith(MockitoJUnitRunner.class) 
@ContextConfiguration 
public class UploadServiceTest { 

    @Mock 
    private SequenceRepository sequenceRepositoryMock; 

    @Autowired 
    private GridFsTemplate gridFsTemplateMock; 

    @Mock 
    private Invoice invoiceMock; 

    @InjectMocks 
    private static UploadService uploadService = new UploadServiceImpl(); 

    DBObject fileMetaData = null; 

    DB db = null; 
    Jongo jongo = null; 

@Before 
    public void setUp() throws Exception { 
     db = new Fongo("Test").getDB("Database"); 
     jongo = new Jongo(db); 
    } 

@Test 
    public void testUploadFile() { 

     //test 1 
     Long mockPaymentNo = new Long(1); 
     Mockito.when(sequenceRepositoryMock.getNextSequenceId(INVOICE_SEQUENCE)).thenReturn(mockPaymentNo); 
     assertEquals(mockPaymentNo, (Long) sequenceRepositoryMock.getNextSequenceId(INVOICE_SEQUENCE)); 

     //test 2 

     Invoice dummyInvoice = getDummyInvoice(); 
     InvoiceInfo dummyInvoiceInfo = dummyInvoice.getInvoiceInfo(); 

     MongoCollection invoicesCollection = jongo.getCollection("invoices"); 

     assertNotNull(invoicesCollection.save(dummyInvoiceInfo)); 
     assertEquals(1, invoicesCollection.save(dummyInvoiceInfo).getN()); 

     System.out.println("TEST 2 >>>>>>>>>>>>>>>>>> "+ uploadService); 


     //test 3 : The following line is the cause of the exception, the service method is called but the GridFsTemplate is not initialized when the test is run. But it works when the endpoint is invoked via postman 

     uploadService.uploadFile(dummyInvoice); 

     System.out.println("TEST 3 >>>>>>>>>>>>>>>>>> "); 

    } 
} 

答えて

1

のための私のユニットテストクラスです。 UploadServiceは、他の2つのBean SequenceRepositoryとGridFsTemplateをオートワイヤーします。

あなたはTDDをやっていないか(と私たちは、最初のテストを変更することができます) している場合 - それは完全に隠されているため、このコードのクライアントは、追加の依存関係について を知らない

Javadocの状態:

Mockitoは順番におよび に記載されているように、コンストラクタ注入、 セッタ注入、またはプロパティ注射によっていずれか一方のみモックを注入しようとします以下。次のいずれかの戦略が失敗すると、Mockitoは レポートの失敗を表示しません。つまり、自分で依存関係を提供する必要があります。

ソリューションは、豆をautowireするUploadServiceImplコンストラクタを使用することです:彼らは、コンストラクタで初期化されているので

より多くの依存関係が必要とされている
@Service 
public final class UploadServiceImpl implements UploadService { 

    private final SequenceRepository sequenceDao; 
    private final GridFsTemplate gridFsTemplate; 
    private final PlannerClient plannerClient; 

    @Autowired 
    public PlannerServiceImpl(PlannerClient plannerClient, GridFsTemplate gridFsTemplate, SequenceRepository sequenceDao) { 
     this.plannerClient = plannerClient; 
    } 
... 

} 

、彼らは目の前ではっきりしている

より詳細:

https://tedvinke.wordpress.com/2014/02/13/mockito-why-you-should-not-use-injectmocks-annotation-to-autowire-fields/

関連する問題