Using @Mock and @InjectMocks



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

但它不起作用——似乎@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;
    }
}

我错过了什么?

好吧,我弄错了!!!我使用了@InjectMocks,但在init()方法中初始化了相同的变量。。。因此,mockito将mock对象注入到我的变量中——但几秒钟后我重新运行了它——初始化了同一个变量!!!

使用Mockito 1.9,您的代码对我来说很好。

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

你看到这个或其他错误信息了吗?

编辑:

以下代码适用于我。小改动:

  • 删除了Spring注释
  • 删除的接口
  • 已添加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());
    }
}

我不确定,但尝试手动创建ReportServiceImpl的新实例(就像您在工作示例中所做的那样):

 @InjectMocks 
 private ReportServiceImpl service = new ReportServiceImpl();

相关内容

  • 没有找到相关文章

最新更新