2015-01-28 13 views
0

EntityManager를 조롱하는 데 문제가 있습니다. 모든 것이 컴파일되고 테스트는 실행되지만 mocked 메서드는 null을 반환합니다.jmockit의 Mockups API를 사용하여 EntityManager를 조롱하는 방법은 무엇입니까?

내가 조롱 된 '찾기'메소드 내에 중단 점을 설정할 때 앱이 절대로 중지되지 않습니다. 저는 정적 방법으로 다른 클래스를 성공적으로 모방 할 수있었습니다. 그러나이 클래스를 사용하면 문제가 있습니다.

Java 1.8.0과 함께 Jmockit 1.7을 사용합니다. 모의하려고하는 클래스는 다음과 같습니다. javax.persistence.EntityManager

더 많은 정보가 필요하면 질문하십시오. 어떤 도움을 주셔서 고맙게 생각합니다.

여기 내 코드입니다 : 버전 1.8 이상에

@RunWith(JMockit.class) 
public class ShapefileSerializerTest { 

    @Mocked 
    private EntityManager em; 

    @BeforeClass 
    public static void setUpBeforeClass() throws Exception { 
     new MockDatabase(); 
    } 

    @Test 
    public void testPrepareShapefile() { 
     String[][] data = new String[][] {{"1", "100"}, {"1", "101"}, {"1", "102"}, {"1", "103"}, {"2", "200"}, {"2", "201"}}; 

     List<Map<String, String>> featuresData = Stream.of(data).map(row -> { 
      Map<String, String> map = new HashMap<>(2); 
      map.put("layerId", row[0]); 
      map.put("id", row[1]); 
      return map; 
     }).collect(Collectors.toList()); 

     ShapefileSerializer shapefileSerializer = new ShapefileSerializer("shapefiles"); 
     // if I do not set up the em here - then it will be null inside the tested class 
     Deencapsulation.setField(shapefileSerializer, em); 

     Response response = shapefileSerializer.prepareShapefile(featuresData); 

     assertEquals(Status.OK.getStatusCode(), response.getStatus()); 
    } 

    public static final class MockDatabase extends MockUp<EntityManager> { 
     @Mock 
     @SuppressWarnings("unchecked") 
     public <T> T find(Class<T> entityClass, Object primaryKey) { 
      return (T) new ProjectLayer(); 
     } 
    } 
} 

답변

0

업그레이드 JMockit, 다음에 테스트 클래스를 변경 : 게시물에 대한

@RunWith(JMockit.class) 
public class ShapefileSerializerTest { 
    @Mocked EntityManager em; 

    @Test 
    public void testPrepareShapefile() { 
     String[][] data = ... 
     List<Map<String, String>> featuresData = ... 

     ShapefileSerializer shapefileSerializer = new ShapefileSerializer("shapefiles"); 
     Deencapsulation.setField(shapefileSerializer, em); 

     new Expectations() {{ 
      em.find((Class<?>) any, any); result = new ProjectLayer(); 
     }}; 

     Response response = shapefileSerializer.prepareShapefile(featuresData); 

     assertEquals(Status.OK.getStatusCode(), response.getStatus()); 
    } 
} 
+0

감사합니다. 불행히도 이것은 효과가 없었습니다. 예상 차단에서 다음과 같은 예외가 발생합니다. IllegalArgumentException : 형식 설명자가 잘못되었습니다. (Ljava/lang/Class ; Ljava/lang/Object;) java/lang/Object; 이 줄은 오류를 발생시킵니다. result = new ProjectLayer(); 나는 이것을 시험해보고 동일한 예외를 얻었다. –

+0

@MarcinRoguski 버전 1.7의 버그로 1.8으로 수정되었습니다. 따라서 JMockit을 버전 1.8 이상으로 업그레이드해야합니다. –

+0

@ Rogério 감사합니다. Expectations와 관련된 문제를 해결했습니다 :) 그러나 EntityManager를 모의하는 것이 왜 효과가 없었는지 아직 모르겠습니다. 나는 또한 다른 클래스와 그것을 시도하고 여전히 동일합니다. 조롱 된 메서드가 호출되지 않습니다. 심지어 인스턴스화되어 다음을 사용하여 테스트 된 클래스로 전달 되었음에도 불구하고 : Deencapsulation.setField (shapefileSerializer, em); –