2012-01-31 128 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