Java 使用@Mock和@injectmock

Java 使用@Mock和@injectmock,java,mocking,mockito,Java,Mocking,Mockito,我目前正在研究Mockito框架,并使用Mockito创建了几个测试用例。 但是后来我读到,我可以使用@mock和@InjectMocks,而不是调用mock(SomeClass.class)——我唯一需要做的就是用@RunWith(MockitoJUnitRunner.class)注释我的测试类,或者使用MockitoAnnotations.initMocks(this) 但是它不起作用-似乎@Mock不起作用! 这是我的两个代码修订版——一个使用注释,另一个不使用注释 我做错了什么 publ

我目前正在研究Mockito框架,并使用Mockito创建了几个测试用例。 但是后来我读到,我可以使用
@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());
    }
}