2017-11-03 3 views
-2

ich Einheit versuche meine Service-Klasse testen, aber der Schein gibt null zurückJUnit Mock Test null zurück zur Verwendung von InjectMocks

package com.tgt.store.pricetask.pricetask_service; 

import com.tgt.store.pricetask.model.PriceTaskMaster; 
import com.tgt.store.pricetask.model.TaskModel; 
import com.tgt.store.pricetask.repository.PriceTaskMasterRepository; 
import com.tgt.store.pricetask.service.DataMigrationService; 
import org.junit.Test; 
import org.junit.runner.RunWith; 
import org.mockito.InjectMocks; 
import org.mockito.Mock; 
import org.mockito.runners.MockitoJUnitRunner; 
import org.springframework.boot.autoconfigure.EnableAutoConfiguration; 
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; 
import org.springframework.boot.test.mock.mockito.MockBean; 
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; 

import java.time.LocalDateTime; 

import static org.junit.Assert.assertEquals; 
import static org.junit.Assert.assertNotNull; 
import static org.mockito.Matchers.any; 
import static org.mockito.Mockito.*; 

@RunWith(SpringJUnit4ClassRunner.class) 
public class DataMigrationServiceTest { 

    @Mock 
    PriceTaskMasterRepository priceTaskMasterRepository; 

    @InjectMocks 
    DataMigrationService dataMigrationService; 

    @Test 
    public void 
testPriceTaskMasterService_whenTaskModelPassed_thenSavePriceTaskMaster() { 

    TaskModel taskModel = new TaskModel.TaskModelBuilder().setTaskID(1) 
      .setDueDate("2017-11-01T11:41:00+0000").setIsAlertable("A").setIsPriority("P").setLocationid("1234") 
      .createTaskModel(); 

    PriceTaskMaster priceTaskMaster = new PriceTaskMaster.PriceTaskMasterBuilder().setId(1L).setTaskStatus("A") 
      .setAlertable("A").setPriority("P").setLocationId(1234) 
      .setDueDate(LocalDateTime.now()).createPriceTaskMaster(); 

    when(priceTaskMasterRepository.insertPriceTaskMaster(any(PriceTaskMaster.class))).thenReturn(priceTaskMaster); 

    PriceTaskMaster savedPriceTaskMaster = dataMigrationService.savePriceTaskMaster(taskModel); 

    assertNotNull(savedPriceTaskMaster); 
    assertEquals("A", savedPriceTaskMaster.getTaskStatus()); 
    assertEquals("P", savedPriceTaskMaster.getPriority()); 
    assertEquals(1234, savedPriceTaskMaster.getLocationId().intValue()); 
    assertEquals(123456789, savedPriceTaskMaster.getTcin().longValue()); 

    verify((priceTaskMasterRepository), times(1)).insertPriceTaskMaster(priceTaskMaster); 
    } 
} 

In dem obigen Code, wenn ein Anruf die Serviceklasse erreicht priceTaskMasterRepository null ist. Ich kann nicht herausfinden, ob mir etwas fehlt. Ich habe versucht RunWith SpringRunner und MockitoJUnitRunner aber dasselbe Ergebnis. Jede Hilfe wird geschätzt.

Vielen Dank im Voraus.

+0

Sind Sie sicher, dass es nicht mit 'MockitoJUnitRunner.class' funktioniert? – alayor

+0

yup .. sehr viel sicher – Venky

+0

Was passiert, wenn Sie 'mock (PriceTaskMasterRepository.class)' stattdessen verwenden? – alayor

Antwort

1

Sie müssen das Feld DataMigrationService initialisieren, wenn Sie die @InjectMocks Annotation verwenden. Das erzeugt eine Instanz der zu testenden Klasse und injiziert die Mock-Objekte in sie.

@InjectMocks 
DataMigrationService dataMigrationService = new DataMigrationService(); 

http://www.baeldung.com/mockito-annotations

+0

Danke @Srikanth, das war es. Ich musste das nur initialisieren. Du hast mich davor bewahrt, meinen ganzen Code zu refaktorieren :) – Venky

-1

Wenn Sie JUnit verwenden Ihre Tests ausführen können, dann sollten Sie etwas davon haben:

@Before 
public void setup() 
{ 
    MockitoAnnotations.initMocks(this); 
} 

Dies stellt sicher, alle Ihre Mocks initialisiert werden. Dies sollte bei Verwendung von MockitoJUnitRunner nicht notwendig sein.

+0

Venky erwähnte er versuchte, mit 'MockitoJUnitRunner' zu verstehen und es funktioniert nicht. – alayor

+0

Ich sah das, also ist es rätselhaft. (Und daher meine Notiz über _supposed_ unnötig zu sein.) – dave

+0

Also OP-Problem ist etwas anderes als das.Ich weiß nicht, was das Problem ist - deshalb habe ich die Frage noch nicht beantwortet. –