首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mockito -mocking实现类

Mockito -mocking实现类
EN

Stack Overflow用户
提问于 2015-07-08 17:31:05
回答 2查看 2.8K关注 0票数 0

嗨,我正在尝试模拟dao层,我的应用程序有一些类租用,就像这个应用程序->解析器->dao(接口)->dao实现类

我的问题是,当我在我的测试用例中使用mockito模拟dao接口或daoimp类时,它们不能工作,简单地测试用例,去db做,使我们的测试用例使用这些被模拟的对象。

代码语言:javascript
复制
    @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();
    }
}
EN

回答 2

Stack Overflow用户

发布于 2015-07-08 18:44:05

代码语言:javascript
复制
CsvDataLoadService csvDataLoadService = new CsvDataLoadServiceImpl();

您正在构造服务的一个实例,但此实例没有使用您模拟的DAO。它使用了另一个。你需要像这样的东西

代码语言:javascript
复制
CsvDataLoadService csvDataLoadService = 
    new CsvDataLoadServiceImpl(meteringDataDao);
票数 1
EN

Stack Overflow用户

发布于 2015-07-08 19:04:22

你的问题表达得有点糟糕,如果我似乎误解了你的意思,我很抱歉。

@JBNizet的答案是正确的,您没有使用mocked对象,而是应该简单地更改测试,而不是更改测试的代码。这始终是编写测试时的最佳实践。

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

如果是这样,那么你将需要比Mockito更强大的东西(除非你想重现一个已经存在的更强大的库的功能)。我建议使用PowerMockito,我以前就用它做过类似的事情。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31288700

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档