我目前正在研究Mockito框架,并且我使用Mockito创建了几个测试用例。
但后来我读到了而不是调用mock( SomeClass .class)我可以使用@Mock
和@InjectMocks
- 我唯一需要做的就是注释我的测试使用@RunWith(MockitoJUnitRunner.class)
的课程,或使用MockitoAnnotations.initMocks(this);
方法中的@Before
。
但它不起作用 - 似乎@Mock
不起作用!
这是我的2个代码修订版 - 一个使用注释,一个没有。
我做错了什么?
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;
}
}
我错过了什么?
答案 0 :(得分:26)
O.K,我搞错了!
我已经使用了@InjectMocks
但是在init()方法中初始化了相同的变量......
所以发生的事情就是mockito将模拟对象注入到我的变量中 - 但是几秒钟后我把它运行了 - 初始化那个相同的变量!!!
答案 1 :(得分:12)
使用Mockito 1.9,您的代码可以正常使用。
使用1.8版本的Mockito我收到一条非常具体的错误消息,告诉我如何解决问题。正如php-coder建议的那样:对于Mockito 1.8+,你需要初始化该字段。
您是否看到此消息或任何其他错误消息?
修改强>
以下代码适用于我。小变化:
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());
}
}
答案 2 :(得分:3)
我不确定,但尝试手动创建ReportServiceImpl
的新实例(正如您在工作示例中所做的那样):
@InjectMocks
private ReportServiceImpl service = new ReportServiceImpl();