首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JMockIt模拟方法不模拟

JMockIt模拟方法不模拟
EN

Stack Overflow用户
提问于 2016-10-07 18:37:47
回答 2查看 2.7K关注 0票数 0

10/7/06 4:00编辑的示例代码--我正在尝试测试一些代码(使用JMockIt和TestNG),而不接触数据库,但它似乎仍然被调用了一个模拟的方法。以下是简化的设置:

代码语言:javascript
复制
class DBRow {
    public DBRow() { }
    public DBRow(Object obj) {
        initialize(obj);
    }
    public void insert() {
        actuallyAddRowToDatabase();
    }
}

class MyObject extends DBRow {
    MyObject(Object obj) {
        super(obj);
    }
    public void insert(Object obj) {
        doSomething(obj);
        insert();
    }
}

class Factory {
    static MyObject createObject(Object obj1, Object obj2) {
        MyObject newObj = new MyObject(obj1);
        newObj.insert(obj2);
        return newObj;
    }
}

我想模拟insert操作,以防止在实际数据库中插入,所以我尝试了如下所示:

代码语言:javascript
复制
@Test
public void testCreation() {
    new Expectations(MyObject.class) {
        MyObject mock = new MyObject(null) {
            @Mock
            public void insert(Object obj) { }
        };
    {
        new MyObject(anyString);   result = mock;
    }};

    MyObject test = Factory.createObject("something", "something else");
}

但是,真正的insert(Object)似乎仍在被调用。我指定类是模拟的,所以所有的实例都应该被模拟,对吗?我指定要对insert方法进行模拟,那么为什么要调用真正的方法呢?

上面还有第二个问题。当我在期望值块中定义模拟类时(如上面所示),似乎只调用了Row()构造函数而不是Row(Object),因此对象没有被正确初始化。我通过将它移动到一个@BeforeTest方法并实例化那里的类来修正这个问题。如下所示:

代码语言:javascript
复制
private MyObject mock;

@BeforeTest
public void beforeTest() {
    new MockUp<MyObject>() {
        @Mock
        public void insert(Object obj) { }
    };
    mock = new MyObject("something");
}

@Test
public void testCreation() {
    new Expectations(MyObject.class) {{
        new MyObject(anyString);   result = mock;
    }};

    MyObject test = Factory.createObject("something", "something else");
}

因此,这似乎得到了正确的构造函数被调用,但仍然似乎insert()也在被调用。有什么见解吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-10-10 20:10:46

我终于能够编写我的测试,这样就可以调用正确的构造函数,并且没有发生实际的数据库操作。我认为我遇到的部分问题是,期望值块中的方法之一是获得一个与我所不感兴趣的参数不同的对象。我认为我的另一个问题是混淆了MockUp类的角色和预期记录。

测试中的代码没有改变。为了方便起见,我再次给出了简化的示例:

代码语言:javascript
复制
class DBRow {
    public DBRow() { }
    public DBRow(Object obj) {
        initialize(obj);
    }
    public void insert() {
        actuallyAddRowToDatabase();
    }
}

class MyObject extends DBRow {
    MyObject(Object obj) {
        super(obj);
    }
    public void insert(Object obj) {
        doSomething(obj);
        insert();
    }
}

class Factory {
    static MyObject createObject(Object obj1, Object obj2) {
        MyObject newObj = new MyObject(obj1);
        newObj.insert(obj2);
        return newObj;
    }
}

从本质上讲,我最终得到的是测试代码:

代码语言:javascript
复制
Object something;
Object somethingElse;

@BeforeTest
public void beforeTest() {
    new MockUp<MyObject>() {
        @Mock
        public void insert() { }  // override the "actual" DB insert
    };                            // of Row.insert()
}

@Test
public void testCreation() {
    MyObject mock = new MyObject(something);  // object correctly init'd
                                              // by Row.initialize(Object)
    new Expectations(MyObject.class) {{
        new MyObject(something);     result = mock;
        mock.insert(somethingElse);
    }};

    MyObject test = Factory.createObject(something, somethingElse);
}

关键是A)我创建了一个MockUp类来覆盖DB操作,而B)创建了这个部分模拟的实例的本地实例来记录我的期望。

票数 0
EN

Stack Overflow用户

发布于 2016-10-07 19:10:37

您不是使用模拟对象来调用函数,即private MyObject mock;,而是使用真正的对象test

代码语言:javascript
复制
MyObject test = new MyObject("something", "something else");

mock上调用mock而不是test

所有实例都不会被自动模拟,您必须使用模拟实例。

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

https://stackoverflow.com/questions/39923853

复制
相关文章

相似问题

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