2012-01-31 129 views
32

我目前正在研究Mockito框架,并使用Mockito创建了多个测试用例。 但后来我读到的不是调用模拟(SomeClass的的.class)我可以使用@Mock@InjectMocks - 我需要做的唯一一件事情就是我的注释测试类@RunWith(MockitoJUnitRunner.class)@Before方法使用MockitoAnnotations.initMocks(this);使用@Mock和@InjectMocks

但它不起作用 - 看起来@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

看起来没给我,乍一看。到底什么地方出了问题? – 2012-01-31 08:14:10

+1

@Noam您确定您使用正确的导入吗? – Brice 2012-01-31 08:49:58

+0

大卫 - 我得到一个NullPointerException。和布赖斯,我相信我使用正确的进口 - 在这里他们'进口org.jmock.auto.Mock; import org.junit.runner.RunWith; import org.mockito.InjectMocks; import org.mockito.MockitoAnnotations; import org.mockito.runners.MockitoJUnitRunner;' – Noam 2012-02-01 08:45:35

回答

24

O.K,我得到了我的错误! 我用@InjectMocks但在init初始化相同的变量()方法... 那么实际情况是,注入的Mockito的模仿对象,以我的变量 - 但秒钟后我跑了过来 - 即初始化非常相同的变量! !

3

我不知道,但尝试创建手动ReportServiceImpl新实例(如你在工作的例子一样):用1.9的Mockito

@InjectMocks 
private ReportServiceImpl service = new ReportServiceImpl(); 
+3

从Mockito 1.9开始,除了边缘情况之外,这已经不再需要了。 – Brice 2012-01-31 08:49:29

+1

如果您使用的1.8,您需要实例它在初始化或构造函数,除非你正在使用'MockitoAnnotations.initMocks(本)'在这种情况下,您需要实例它被调用之前。 – jhericks 2012-01-31 16:35:12

+3

首先,感谢您的回复。但期运用MockitoAnnotations.initMocks(这)不是neccesary,因为我用@RunWith(MockitoJUnitRunner.class)。 – Noam 2012-02-01 08:39:55

12

您的代码工作正常,我。

使用1.8 +版本的Mockito我得到一个非常具体的错误消息告诉我如何解决这个问题。正如php编码器建议的那样:对于Mockito 1.8+,您需要初始化该字段。

您是否看到这个或任何其他错误消息?

编辑:

下面的代码对我的作品。小的变化:

  • 删除Spring注解
  • 排出的界面
  • 新增消气
  • 加空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()); 
    } 
} 
+0

嗨,我使用的是1.9的Mockito以及... – Noam 2012-02-01 08:46:18

+1

正如我说的,代码为我工作。你可以测试我发布的代码(仅适用于较小的更改)吗? – 2012-02-01 13:14:06

+0

阿伦德嗨,抱歉耽搁 - 但你的代码工作为我好,我用的@Mock注释拨错进口 - 进口org.mockito.MockitoAnnotations;而不是导入org.mockito.Mock; – Noam 2012-02-20 09:47:26