Java 使用@Mock和@injectmock
我目前正在研究Mockito框架,并使用Mockito创建了几个测试用例。 但是后来我读到,我可以使用Java 使用@Mock和@injectmock,java,mocking,mockito,Java,Mocking,Mockito,我目前正在研究Mockito框架,并使用Mockito创建了几个测试用例。 但是后来我读到,我可以使用@mock和@InjectMocks,而不是调用mock(SomeClass.class)——我唯一需要做的就是用@RunWith(MockitoJUnitRunner.class)注释我的测试类,或者使用MockitoAnnotations.initMocks(this) 但是它不起作用-似乎@Mock不起作用! 这是我的两个代码修订版——一个使用注释,另一个不使用注释 我做错了什么 publ
@mock
和@InjectMocks
,而不是调用mock(SomeClass.class)——我唯一需要做的就是用@RunWith(MockitoJUnitRunner.class)
注释我的测试类,或者使用MockitoAnnotations.initMocks(this)在@Before
方法中的code>
但是它不起作用-似乎@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
}
下面是reportserviceinpl
类:
@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;
}
}
我缺少什么?我不确定,但尝试手动创建ReportServiceImpl
的新实例(如您在工作示例中所做的):
使用Mockito 1.9,您的代码对我来说运行良好
使用Mockito的1.8+版本,我会收到一条非常具体的错误消息,告诉我如何解决问题。正如php程序员所建议的:对于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());
}
}
好吧,我弄错了!!!
我使用了@InjectMocks
,但在init()方法中初始化了相同的变量。。。
所以发生的事情是mockito将mock对象注入到我的变量中——但几秒钟后我运行了它——初始化了同一个变量 乍一看,我觉得还可以。你到底出了什么问题?@Noam你确定你使用的是正确的导入吗?大卫-我得到了一个NullPointerException。还有Brice,我相信我使用的是正确的导入——这里是“import org.jmock.auto.Mock;导入org.junit.runner.RunWith;导入org.mockito.InjectMocks;导入org.mockito.MockitoAnnotations;导入org.mockito.runners.MockitoJUnitRunner;'这不再是必需的,因为Mockito 1.9是edge case的例外。如果您使用1.8,您需要在初始值设定项或构造函数中实例化它,除非您使用的是MockitoAnnotations。在这种情况下,您需要在调用它之前实例化它。首先,感谢您的回复。但是使用MockitoAnnotations.initMocks(this)并不是必需的,因为我使用了@RunWith(MockitoJUnitRunner.class)。你能测试我发布的代码吗(只做了一些小改动)?嗨,阿伦德,很抱歉耽搁了你的时间-但是你的代码对我来说也很有用,我已经使用了一个worng导入@Mock annotation-import org.mockito.MockitoAnnotations;而不是导入org.mockito.Mock;感谢上帝给了我这个问题和自我实现的答案。我的头发都掉光了。
@RunWith(MockitoJUnitRunner.class)
public class ReportServiceImplTestMockito {
@Mock
private TaskService mockTaskService;
@InjectMocks
private ReportServiceImpl service;
@Test
public void testMockInjected() {
System.out.println(service.getTaskServiceImpl());
}
}