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()
會讓它期望調用。我在這裏做錯了什麼?
是的,就是這樣。我將'mo mo = context.mock(Mo.class);'從類定義移動到'testFilterDuplicatesByName_oneMo()'方法的開頭,它開始工作! – 2013-03-21 00:52:47
這對我來說沒有意義。我會確保你明白究竟有什麼不同。 當你在這裏,我會建議使用允許()子句,因爲你只是查詢一個值 - 如果可能的話,甚至只是一個真實的對象。 另外,您應該查看JUnit4RuleMockery而不是顯式檢查上下文。 – 2013-03-21 09:25:44