嗨,我正在尝试模拟dao层,我的应用程序有一些类租用,就像这个应用程序->解析器->dao(接口)->dao实现类
我的问题是,当我在我的测试用例中使用mockito模拟dao接口或daoimp类时,它们不能工作,简单地测试用例,去db做,使我们的测试用例使用这些被模拟的对象。
@RunWith(MockitoJUnitRunner.class)
public class CsvDataLoadServiceImplTest {
@Mock private MeteringDataDao meteringDataDao;
List<Object> persistedList;
Object meteringData;
List<Object> s=new ArrayList<Object>();
@SuppressWarnings({ "rawtypes", "unchecked" })
@Before public void setup(){
Mockito.doAnswer(new Answer<List<Object>>() {
@Override
public List<Object> answer(InvocationOnMock invocation) throws Throwable {
Object[] args = invocation.getArguments();
System.out.println("persist all");
if(persistedList == null){
persistedList = (List)args[0];
}
else
persistedList.addAll((List)args[0]);
return null;
}}).when(meteringDataDao).persistAll(anyList());
Mockito.doAnswer(new Answer<Object>() {
@Override
public Object answer(InvocationOnMock invocation) {
Object[] args = invocation.getArguments();
if(meteringData == null)
meteringData = (List)args[0];
return true;
}}).when(meteringDataDao).persist(anyObject());
}
@After public void tearDown(){
persistedList = null;
meteringData = null;
}
@Test
public void testDataAccuricy(){
CsvDataLoadService csvDataLoadService =new CsvDataLoadServiceImpl();
csvDataLoadService.loadRackspaceCsvData();
}
}发布于 2015-07-08 18:44:05
CsvDataLoadService csvDataLoadService = new CsvDataLoadServiceImpl();您正在构造服务的一个实例,但此实例没有使用您模拟的DAO。它使用了另一个。你需要像这样的东西
CsvDataLoadService csvDataLoadService =
new CsvDataLoadServiceImpl(meteringDataDao);发布于 2015-07-08 19:04:22
你的问题表达得有点糟糕,如果我似乎误解了你的意思,我很抱歉。
@JBNizet的答案是正确的,您没有使用mocked对象,而是应该简单地更改测试,而不是更改测试的代码。这始终是编写测试时的最佳实践。
您还没有将模拟对象分配给服务,所以我假设MeteringDataDao对象实际上是在您试图测试的类中实例化的?
如果是这样,那么你将需要比Mockito更强大的东西(除非你想重现一个已经存在的更强大的库的功能)。我建议使用PowerMockito,我以前就用它做过类似的事情。
使用powermockito模拟类的构造函数的一个很好的例子已经在SO上的一些答案中看到了,所以我将只链接到它们,而不是尝试重新解释它们已经很清楚的答案:
https://stackoverflow.com/questions/31288700
复制相似问题