使用@Mock和@InjectMocks

2022-09-01 04:37:36

我目前正在研究Mockito框架,我已经使用Mockito创建了几个测试用例。但后来我读到,我可以使用 and the - 我唯一需要做的就是用和来注释我的测试类,而不是调用 mock(SomeClass.class),或者在方法中使用 the。@Mock@InjectMocks@RunWith(MockitoJUnitRunner.class)MockitoAnnotations.initMocks(this);@Before

但它不起作用 - 似乎不会起作用!这是我的2个代码修订版 - 一个使用注释,一个没有。@Mock

我做错了什么?

public class ReportServiceImplTestMockito {

    private TaskService       mockTaskService; // This is the Mock object
    private ReportServiceImpl service;

    @Before
    public void init(){
        service         = new ReportServiceImpl();
        mockTaskService = mock(TaskServiceImpl.class);
        service.setTaskServiceImpl(mockTaskService);
    }
/// ...

 Some tests
}

正如我所说 - 这工作很棒。但以下情况不会:

@RunWith(MockitoJUnitRunner.class)
public class ReportServiceImplTestMockito {

     @Mock 
     private TaskService      mockTaskService;

     @InjectMocks 
     private ReportServiceImpl service;

         // Some tests
}

这是类:ReportServiceImpl

@Service
public class ReportServiceImpl implements ReportService {

    @Autowired
    private TaskService taskServiceImpl;

    public ReportServiceImpl(){}

    public ReportServiceImpl(TaskService taskService){
        this.taskServiceImpl = taskService;
    }

    public void setTaskServiceImpl(TaskService taskServiceImpl) {
        this.taskServiceImpl = taskServiceImpl;
    }
}

我错过了什么?


答案 1

好吧,我犯了错误!!!我已经在init()方法中使用了但初始化了相同的变量...所以发生的事情是,mockito将模拟对象注入到我的变量中 - 但几秒钟后我运行了它 - 初始化了相同的变量!!!@InjectMocks


答案 2

你的代码对我使用Mockito 1.9工作正常。

使用1.8 +版本的Mockito,我收到一条非常具体的错误消息,告诉我如何解决问题。正如php-coder所建议的:对于Mockito 1.8 +,您需要初始化该字段。

您是否看到此错误消息或任何其他错误消息?

编辑:

以下代码适用于我。小变化:

  • 删除了弹簧批注
  • 已删除的接口
  • 已添加 Getter
  • 已添加空TaskService
  • 添加了测试System.out.println

它是否为您产生错误?:

服务:

public class ReportServiceImpl {

    private TaskService taskServiceImpl;


    public ReportServiceImpl() {

    }


    public ReportServiceImpl(TaskService taskService) {
        this.taskServiceImpl = taskService;
    }


    public void setTaskServiceImpl(TaskService taskServiceImpl) {
        this.taskServiceImpl = taskServiceImpl;
    }


    public TaskService getTaskServiceImpl() {
        return taskServiceImpl;
    }
}

屬地:

public class TaskService {

}

测试,打印 :mockTaskService

@RunWith(MockitoJUnitRunner.class)
public class ReportServiceImplTestMockito {

    @Mock
    private TaskService       mockTaskService;

    @InjectMocks
    private ReportServiceImpl service;


    @Test
    public void testMockInjected() {
        System.out.println(service.getTaskServiceImpl());
    }
}

推荐