2016-08-11 11 views
1

"getEntityManager"라는 private 메소드가있는 클래스를 테스트하고 있습니다. 이 메소드는 public 메소드 "getAllProducts"에서 사용될 엔티티 관리자 인스턴스를 리턴합니다. 그래서 PowerMockRunner를 사용합니다. 내 의존성은 다음과 같습니다Powermock : 스파이 된 클래스를 사용하는 동안 조롱 된 객체를 반환하지 못했습니다.

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 

하이어 내 (@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를 사용해보십시오. 마지막으로, 좋은 대답을 얻지 못하면 powermock에 대한 Google 그룹을 사용해보십시오. 그리고 마지막으로 라인 번호 예외가 있습니다. 코드의 어느 줄에서 예외가 있다고 말하면 도움이된다고 생각하지 않습니까? – GhostCat

+0

예외의 마지막 줄뿐만 아니라 전체 스택 추적을 추가하십시오. –

답변

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); 
    ... 

테스트를 통과했다.