您好我正在尝试模拟dao图层 我的应用程序有一些类雇佣achy像这样的Application-> parser-> 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();
}
}
答案 0 :(得分:1)
CsvDataLoadService csvDataLoadService = new CsvDataLoadServiceImpl();
您正在构建服务的实例,但此实例并未使用您模拟的DAO。它使用另一个。你需要像
这样的东西CsvDataLoadService csvDataLoadService =
new CsvDataLoadServiceImpl(meteringDataDao);
答案 1 :(得分:0)
你的问题有点严厉,很抱歉,如果我似乎误解了你。
@JBNizet答案是正确的,你没有使用模拟对象,而是更改测试代码而不是更改测试。在编写测试时,这始终是最佳实践。
您还没有将模拟对象分配给服务,所以我假设MeteringDataDao对象实际上是在您尝试测试的类中实例化的?
如果是这样,那么你将需要比Mockito更强大的东西(除非你想重现更强大的现有库的功能)。我建议使用PowerMockito,我过去曾经使用过类似的东西。
使用powermockito来模拟类的构造函数的一个很好的例子可以在SO的几个答案中看到,所以我只是链接到它们而不是尝试重新解释它们已经明确的答案: