我目前正在研究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();