Метод проверки Mockito не вызывается - PullRequest
0 голосов
/ 09 мая 2018

Я новичок в Мокито и пытаюсь проверить следующий класс.

@Service
public class MyService {

public static final Logger logger = LoggerFactory.getLogger(MyService.class);

ObjectMapper objectMapper = new ObjectMapper(); 

public void logData(String personData) throws IOException{

    Person person = objectMapper.readValue(personData, Person.class);

    // log info
    logger.info("log person:  {}, {}", person.getName(), person.getAge());

 }
}

Ниже приведен мой тестовый класс, и я пытаюсь проверить, вызывается ли метод readValue ObjectMapper.

@RunWith(MockitoJUnitRunner.class)
public class MyServiceTest {

public static final Logger logger = LoggerFactory.getLogger(MyServiceTest.class);

ObjectMapper objectMapper = mock(ObjectMapper.class);

MyService myService = new MyService();

@Test
public void verifyCallToReadValue() throws IOException{

    String personData = "{\"Name\":\"debieA\",\"Age\":\"31\"}";

    myService.logData(personData);

    verify(objectMapper, times(1)).readValue(personData, Person.class);
   }
 }

Ошибка, которую я получаю, "требуется, но не вызывается" Требуется, но не вызывается: objectMapper.readValue (......); "

Как я могу исправить эту проблему?

Ответы [ 2 ]

0 голосов
/ 09 мая 2018

Используйте аннотацию @Spy, шпион очень умный, чтобы позвонить

@Spy
ObjectMapper objectMapper = new ObjectMapper();

MyService myService = new MyService();

@Test
public void verifyCallToReadValue() throws IOException{

    String personData = "{\"Name\":\"debieA\",\"Age\":\"31\"}";

    myService.logData(personData);

    verify(objectMapper, times(1)).readValue(personData, Person.class);
   }
 }
0 голосов
/ 09 мая 2018

Макет ObjectMapper должен быть введен как зависимость от MyService.

Никогда не создавайте зависимости ваших классов внутри самого класса, с помощью new, как вы делаете это в MyService (ObjectMapper objectMapper = new ObjectMapper())!

Обратите внимание на мои комментарии и изменения в вашем коде:

@Service
public class MyService {

public static final Logger logger = LoggerFactory.getLogger(MyService.class);

//ObjectMapper objectMapper = new ObjectMapper(); //never do that
//instead init the field in the constructor using an external dependency
private ObjectMapper objectMapper;
public MyService(ObjectMapper objectMapper) {
    this.objectMapper = objectMapper;
}

public void logData(String personData) throws IOException{

    Person person = objectMapper.readValue(personData, Person.class);

    // log info
    logger.info("log person:  {}, {}", person.getName(), person.getAge());

 }
}

А потом в тесте

@RunWith(MockitoJUnitRunner.class)
public class MyServiceTest {

public static final Logger logger = LoggerFactory.getLogger(MyServiceTest.class);

ObjectMapper objectMapper = mock(ObjectMapper.class);

@Test
public void verifyCallToReadValue() throws IOException{
    MyService myService = new MyService(objectMapper);
    // here you have to mock the readValue method. Something like this:
    //when(objectMapper.readValue(...)).thenReturn(new Person());
    String personData = "{\"Name\":\"debieA\",\"Age\":\"31\"}";

    myService.logData(personData);

    verify(objectMapper, times(1)).readValue(personData, Person.class);
   }
 }
...