簡體   English   中英

Mockito驗證方法未調用

[英]Mockito verify method doesn't get invoked

我是Mockito的初學者,正在嘗試測試以下課程。

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

 }
}

以下是我的測試類,我正在嘗試測試是否調用了ObjectMapper的readValue方法。

@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(......);”

如何解決此問題?

必須將ObjectMapper模擬作為對MyService的依賴項進行注入。

切勿像在MyService( ObjectMapper objectMapper = new ObjectMapper() )中那樣在類本身內部使用new創建類的依賴項!

注意我的注釋和代碼更改:

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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