【发布时间】:2016-10-11 04:10:46
【问题描述】:
[10/7/06 4:00 编辑的示例代码] 我正在尝试在不接触数据库的情况下测试一些代码(使用 JMockIt 和 TestNG),但实际上仍然调用了一个模拟方法。这是简化的设置:
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;
}
}
我想模拟插入操作以防止在实际数据库中插入,所以我尝试了这样的操作:
@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) 仍在被调用。我指定类是模拟的,所以所有的实例都应该被模拟,对吧?而且我指定应该模拟插入方法,那么为什么要调用真正的方法呢?
上面还有第二个问题。当我在 Expectations 块中定义模拟类时(如上),似乎只调用了 Row() 构造函数而不是 Row(Object),因此对象未正确初始化。我通过将其移入@BeforeTest 方法并在那里实例化该类来解决此问题。看起来是这样的:
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()。有什么见解吗?
【问题讨论】:
标签: java unit-testing testng jmockit database-testing