使用@Mock和@InjectMocks

时间:2012-01-31 08:09:49

标签: java mocking mockito

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

我错过了什么?

3 个答案:

答案 0 :(得分:26)

O.K,我搞错了! 我已经使用了@InjectMocks但是在init()方法中初始化了相同的变量...... 所以发生的事情就是mockito将模拟对象注入到我的变量中 - 但是几秒钟后我把它运行了 - 初始化那个相同的变量!!!

答案 1 :(得分:12)

使用Mockito 1.9,您的代码可以正常使用。

使用1.8版本的Mockito我收到一条非常具体的错误消息,告诉我如何解决问题。正如php-coder建议的那样:对于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());
    }
}

答案 2 :(得分:3)

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

 @InjectMocks 
 private ReportServiceImpl service = new ReportServiceImpl();