В настоящее время я пытаюсь проверить метод, который создает массив объектов, а затем выполняет метод объекта с массивом объектов в качестве параметра. Каждый раз, когда я пытаюсь это сделать, я продолжаю получать ошибку constructorNotFound
. Прошу прощения, если его неясно, но, надеюсь, вы сможете понять, о чем я говорю в моем примере ниже.Как ожидать создания массива с PowerMock
public class Bar {
public final String name;
public final Bar[] barList;
public Bar(String name) {
this.name = name;
barList = null;
}
public Bar update(Bar[] bar) {
Bar newBar = new Bar(name);
newBar.barList = bar;
return newBar;
}
}
public class Foo {
public static Bar internalMethod(Bar oldBar) {
// in reality this method does a lot more
// I just kept it simple for demonstration purposes
Bar[] bar = new Bar[2];
oldBar = oldBar.update(bar);
// about 15-20 method calls with oldBar as a parameter
// and require mocking
return oldBar;
}
}
Вот тестовый класс:
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.api.easymock.PowerMock;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
@RunWith(PowerMockRunner.class)
@PrepareForTest(Bar[].class)
public class testFoo {
@Test
public void test() throws Exception {
Bar[] barArr = new Bar[2];
PowerMock.expectNew(Bar[].class).andReturn(barArr);
PowerMock.replay(Bar[].class);
Bar bar = new Bar("name");
Bar newBar = Foo.internalMethod(bar);
// assume there are many more checks to make sure that the appropriate
// methods were called and the changes were made
assertEquals("name", newBar.name);
assertNull(newBar.barList[0]);
assertNull(newBar.barList[1]);
}
}
Кто-нибудь знает, как справиться с такой ситуацией, как это?
Я понимаю, что дизайн класса не идеален, но, к сожалению, я не могу его изменить. Я использую PowerMock 1.4.10, и у меня нет доступа к mockito framework.
Я честно не понимаю, что вы здесь делаете. Если вы действительно собираетесь тестировать метод, не имеет смысла манипулировать тем, что делает сам метод. Я бы понял, если вы попытались издеваться над тем, что делает этот метод, чтобы протестировать другой код, который фактически использует ваш метод methodToTest, но это не имеет для меня никакого смысла. Кроме того, 'methodToTest', как он указан здесь, ничего не делает (кроме того, что он добавляет некоторые работы для сборщика мусора). Так ... извините, но я не понимаю, о чем вы говорите. – skirsch
Я обновил вопрос и метод 'methodToTest', так что ситуация немного более реалистична, так как мой оригинальный пример был упрощен, как отметил @skirsch. Я также добавил некоторые комментарии, чтобы уточнить, где я принял некоторые свободы, чтобы упростить код. – HardcoreBro
Хорошо. Думаю, вы не можете этого сделать; посмотрите [здесь] (https://code.google.com/p/powermock/wiki/MockConstructor) и найдите «массив». Я не уверен, чего вы хотите достичь (похоже, вы хотите точно высмеять то, что сделано в любом случае?). Но все же я думаю, что если вы хотите протестировать этот метод, вам не следует возиться со своими внутренностями , Самое смешное, что утверждения выглядят так, будто вы фактически тестируете метод Bar.update; но я предполагаю, что это из-за упрощений ... – skirsch