[英]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.