2016-08-11 3 views
1

Я тестирую класс, который имеет частный метод getEntityManager. Этот метод возвращает экземпляр менеджера сущностей, который будет использоваться в общедоступном методе «getAllProducts». Поэтому я использую PowerMockRunner; Мои зависимостей:Powermock: возвращение издевающихся объектов при использовании класса spied не удалось

junit-4.1.2 
mockito-all-1.10.19 
powermock-module-junit4- 1.6.5 
powermock-api-mockito-1.6.5 
javassist-3.12.1.GA 

Hier мой (@GhostCat расширенный) Код:

@RunWith(PowerMockRunner.class) 
@PrepareForTest(ProduktDB.class) 
public class ProduktDBTest { 

    static final String PRODUCTID= "id"; 
    List<Product> productList; 
    EntityManager emmock; 
    Query q; 

    @Before 
    public void setUp() throws Exception { 
    basicProductList= new ArrayList<>(); 
    BasicProductDao basicProductDao= new BasicProductDao(); 
    basicProductDao.setId(PRODUCTID); 
    basicProductList.add(basicProductDao); 

    emmock= mock(EntityManager.class); 
    q= mock(Query.class); 
    } 

    @Test 
    public void getAllProducts() throws Exception { 
    when(emmock.createQuery(anyString())).thenReturn(q); 
    when(q.getResultList()).thenReturn(productList);  
    ProduktDB spied= spy(new ProduktDB()); 

    /* ***********this is the line with the error:****** */ 
    PowerMockito.doReturn(emmock).when(spied, "getEntityManager"); 

    assertEquals(spied.getAllProducts().get(0).getId(),PRODUCTID); 
    } 
} 

Однако я получаю следующее сообщение об ошибке, когда я хочу, чтобы добавить возвращаемое значение по вызову в частный метод:

java.lang.NullPointerException 
at org.powermock.api.mockito.internal.expectation.PowerMockitoStubberImpl.addAnswersForStubbing(PowerMockitoStubberImpl.java:68) 

Теперь я изменить критическую линию на следующее:

PowerMockito.when(spied, "getEntityManager").thenReturn(emmock); 

Нет. Я получаю другую ошибку, но безвредна (см. Решение ниже). :)

+0

Сторона примечания: не используйте «_» в именах переменных. За исключением констант, таких как PRODUCT_ID. И имена методов должны быть camelCase. И вместо прямого вызова prepareList(), используйте @Before. Наконец: если вы не получили здесь хорошего ответа, попробуйте группы google для powermock. И, наконец: у вас есть исключение с номером строки. Разве вы не думаете, что было бы полезно, если бы вы сказали нам, какая строка в вашем коде дает это исключение? – GhostCat

+0

Пожалуйста, добавьте полную stacktrace, а не только последнюю строку исключения. –

ответ

1

Новая ошибка:

org.mockito.exceptions.misusing.MissingMethodInvocationException: 
... 
... 
at org.powermock.api.extension.reporter.MockingFrameworkReporterFactoryImpl$PowerMockitoReporter.missingMethodInvocation(MockingFrameworkReporterFactoryImpl.java:66) 
at de.ams.dpag.produktdb.ProduktDBAdapterTest.getAllProducts(ProduktDBAdapterTest.java:72) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
at ... 
.... 

Причина заключалась в том, что «getEntityManager» вызывает статический метод базового класса. Я должен был mocStatic (BaseclassWitStaticMethod) тоже, а затем добавить ожидаемое значение возврата к нему, как это:

@PrepareForTest({ProduktDB.class, BaseClasswithStaticMethod.class}) 
... 
    ProduktDB spied= spy(new ProduktDB()); 
    mockStatic(BaseClasswithStaticMethod.class); 
    when(BaseClasswithStaticMethod.getEntityManager()).thenReturn(emmock); 
    ... 

Тест пройден.

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