2013-03-20 38 views
1

我似乎無法找出我做錯了什麼在這裏:JMock的「意外調用」的,我有一個oneOf(實例)的方法。方法()預計

這是我的方法米測試:

public List<Mo> filterDuplicatesByName(List<Mo> dbMos) { 
    List<String> names = Lists.newArrayList(); 
    for(Mo mo : dbMos) { 
     try { 
      String name = mo.getName(); 
      if(names.contains(name)) { 
       dbMos.remove(mo); 
      } else { 
       names.add(name); 
      } 
     } catch (DataLayerException ex) { 
      dbMos.remove(mo); 
     } 
    } 
    return dbMos; 
} 

這是我的測試類:

package com.rondavu.wt.service.recommendations; 

import com.google.common.collect.Lists; 
import com.rondavu.data.api.Mo; 
import org.jmock.Expectations; 
import org.jmock.Mockery; 
import org.jmock.lib.legacy.ClassImposteriser; 
import org.junit.Before; 
import org.junit.Test; 

import java.util.ArrayList; 
import java.util.List; 

import static org.junit.Assert.assertEquals; 

public class RecommendationsUtilsTest { 

    Mockery context = new Mockery(); 

    RecommendationsUtils recommendationsUtils = new RecommendationsUtils(); 

    final Mo mo = context.mock(Mo.class); 

    @Test 
    public void testFilterDuplicatesByName_oneMo() throws DataLayerException { 
     List<Mo> input = Lists.newArrayList(mo); 
     List<Mo> expected = Lists.newArrayList(mo); 

     context.checking(new Expectations() {{ 
      oneOf (mo).getName(); will(returnValue("Mo 1")); 
     }}); 

     List<Mo> actual = recommendationsUtils.filterDuplicatesByName(input); 

     context.assertIsSatisfied(); 

     assertEquals(expected, actual); 
    } 
} 

當我運行測試,我得到這樣的輸出:

unexpected invocation: mo.getName() 
no expectations specified: did you... 
- forget to start an expectation with a cardinality clause? 
- call a mocked method to specify the parameter of an expectation? 
what happened before this: nothing! 
    [stack trace] 

我對jMock非常陌生,Java並不是我最強的語言,但我認爲我的oneOf (mo).getName()會讓它期望調用。我在這裏做錯了什麼?

回答

2

雖然目前尚不清楚爲什麼在這一點上,Mockery似乎正在檢查與您定義期望值相比的不同Mo實例。嘗試將context.mock(Mo.class)插入與測試用例相同的本地作用域中(或者在@Before方法中)並查看是否修復了這些問題。

+0

是的,就是這樣。我將'mo mo = context.mock(Mo.class);'從類定義移動到'testFilterDuplicatesByName_oneMo()'方法的開頭,它開始工作! – 2013-03-21 00:52:47

+0

這對我來說沒有意義。我會確保你明白究竟有什麼不同。 當你在這裏,我會建議使用允許()子句,因爲你只是查詢一個值 - 如果可能的話,甚至只是一個真實的對象。 另外,您應該查看JUnit4RuleMockery而不是顯式檢查上下文。 – 2013-03-21 09:25:44

相關問題