Mockito -mocking实现类

时间:2015-07-08 09:31:05

标签: junit mockito

您好我正在尝试模拟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();
    }
}

2 个答案:

答案 0 :(得分:1)

CsvDataLoadService csvDataLoadService = new CsvDataLoadServiceImpl();

您正在构建服务的实例,但此实例并未使用您模拟的DAO。它使用另一个。你需要像

这样的东西
CsvDataLoadService csvDataLoadService = 
    new CsvDataLoadServiceImpl(meteringDataDao);

答案 1 :(得分:0)

你的问题有点严厉,很抱歉,如果我似乎误解了你。

@JBNizet答案是正确的,你没有使用模拟对象,而是更改测试代码而不是更改测试。在编写测试时,这始终是最佳实践。

您还没有将模拟对象分配给服务,所以我假设MeteringDataDao对象实际上是在您尝试测试的类中实例化的?

如果是这样,那么你将需要比Mockito更强大的东西(除非你想重现更强大的现有库的功能)。我建议使用PowerMockito,我过去曾经使用过类似的东西。

使用powermockito来模拟类的构造函数的一个很好的例子可以在SO的几个答案中看到,所以我只是链接到它们而不是尝试重新解释它们已经明确的答案: