[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(Object)
вызывается только конструктор Row()
, и, следовательно, объект не инициализирован правильно. Я исправил это, переместив его в @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()
. Есть идеи?