2013-04-23 4 views
1

В настоящее время я пытаюсь проверить метод, который создает массив объектов, а затем выполняет метод объекта с массивом объектов в качестве параметра. Каждый раз, когда я пытаюсь это сделать, я продолжаю получать ошибку 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.

+1

Я честно не понимаю, что вы здесь делаете. Если вы действительно собираетесь тестировать метод, не имеет смысла манипулировать тем, что делает сам метод. Я бы понял, если вы попытались издеваться над тем, что делает этот метод, чтобы протестировать другой код, который фактически использует ваш метод methodToTest, но это не имеет для меня никакого смысла. Кроме того, 'methodToTest', как он указан здесь, ничего не делает (кроме того, что он добавляет некоторые работы для сборщика мусора). Так ... извините, но я не понимаю, о чем вы говорите. – skirsch

+0

Я обновил вопрос и метод 'methodToTest', так что ситуация немного более реалистична, так как мой оригинальный пример был упрощен, как отметил @skirsch. Я также добавил некоторые комментарии, чтобы уточнить, где я принял некоторые свободы, чтобы упростить код. – HardcoreBro

+0

Хорошо. Думаю, вы не можете этого сделать; посмотрите [здесь] (https://code.google.com/p/powermock/wiki/MockConstructor) и найдите «массив». Я не уверен, чего вы хотите достичь (похоже, вы хотите точно высмеять то, что сделано в любом случае?). Но все же я думаю, что если вы хотите протестировать этот метод, вам не следует возиться со своими внутренностями , Самое смешное, что утверждения выглядят так, будто вы фактически тестируете метод Bar.update; но я предполагаю, что это из-за упрощений ... – skirsch

ответ

1

Hm. Разве вы не можете просто издеваться над экземпляром Bar, который вы передадите в качестве аргумента, ожидая, что update будет вызван массивом Bar[], возвращая все, что вы хотите, и так далее?

Это может выглядеть следующим образом:

@Test 
public void test() throws Exception { 
    Bar bar = new Bar("name").update(new Bar[2]); 
    Bar barMock = EasyMock.createMock(Bar.class); 
    EasyMock.expect(barMock.update(EasyMock.aryEq(new Bar[2]))).andReturn(bar); 
    EasyMock.replay(barMock); 

    Bar newBar = Foo.internalMethod(barMock); 

    EasyMock.verify(barMock); 
    assertEquals("name", newBar.name); 
    assertNull(newBar.barList[0]); 
    assertNull(newBar.barList[1]); 
} 

Это тоже выглядит немного смешно, как утверждает все проверить экземпляр Bar быть создан в начале испытания. Но, учитывая, что internalMethod делает намного больше, он проверяет, что возвращаемый экземпляр Bar фактически не подделан.

+0

Я думаю, вы сейчас понимаете, что я пытаюсь объяснить. Я хочу знать, как ожидать, что 'update' будет вызываться с помощью массива' Bar [] '. Что такое синтаксис для чего-то подобного? Синтаксис групп Google предположил, что это может быть невозможно. [link] (https://code.google.com/p/powermock/wiki/MockConstructor) – HardcoreBro

+0

Посмотрите мои последние изменения – skirsch

+0

Я думаю, что это может сработать! Я никогда не использовал EasyMock.aryEq раньше, но на основе API, я не вижу причин, почему это не сработает. Я попробую и дам вам знать, что произойдет. – HardcoreBro

 Смежные вопросы

  • Нет связанных вопросов^_^