有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

未调用java Mockito验证方法

我是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);
   }
 }

我得到的错误是“需要但未调用需要但未调用: 对象映射器。读取值(……);"

如何解决此问题


共 (2) 个答案

  1. # 1 楼答案

    必须将ObjectMappermock作为依赖项注入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);
       }
     }
    
  2. # 2 楼答案

    使用@Spy注释,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);
       }
     }