2017-02-06 14 views
2

Не мог бы кто-нибудь помочь мне в этом. Я пишу модульный тест для ресурса Rest с помощью тестовой среды для тестирования остальной версии версии 1.21 (на контейнере Grizzly).Единичное тестирование с использованием схемы тестирования остатков Джерси и Mockito

Когда я отлаживаю тестовый класс, я вижу mock-объект для myManager. Но когда отладка входит в мой класс MyResouce, объект myManager становится нулевым и получает исключение NullPointer.

Пробовал с решениями, предоставленными разными людьми, но не повезло. Может кто-нибудь мне помочь. дней. :(

класс

мой ресурс, как это.

@Component 
@Path("/somepath") 
public class MyResource { 
    @Autowired 
    private MyManager myManager; 

    @Path("/somepath") 
    @GET 
    @Produces("application/json") 
    @ResponseType(String.class) 
    public Response getResults(@QueryParam("queryParam") String number) { 
     // myManager is an interface 
     String str = myManager.getResult(number); 
    } 
} 

А вот мой TestClass

public class MyResourceTest extends JerseyTest { 
    @Mock 
    private MyManager myManager; 

    @InjectMocks 
    private MyResource myResource; 

    @Override 
    protected Application configure() { 
     MockitoAnnotations.initMocks(this); 
     return new ResourceConfig().register(MyResource.class) 
       .register(new AbstractBinder() { 
        @Override 
        protected void configure() { 
         bind(myManager).to(MyManager.class); 
        } 
       }); 
    } 

    @Test 
    public void getResultsTest() { 
     when(myManager.getResult(anyString())).thenReturn(mock(String.class)); 
     String str = target("path").queryParam("queryParam","10").request().get(String.class); 
    } 
} 
+0

внутри MyResource есть MyManager, что объект является недействительным правильно? – VedX

+0

Благодарим вас за ответ. Да ты прав. Макет-объект становится нулевым в классе MyResource. Кстати, я использую Mockito и @Mocked annotataion недоступен. – Vijaya

ответ

2

Вы используете SPR (инъекции), поэтому служба будет рассмотрена из весеннего контекста. Вот почему это пустое, потому что вы не настроили макет в весеннем контексте.

Лучше всего использовать инжектор конструктора (вместо инъекции в поле). Это делает тестирование намного проще

@Path(..) 
public class MyResource { 
    private final MyManager manager; 

    @Autowired 
    public MyResource(MyManager manager) { 
     this.manager = manager; 
    } 
} 

Тогда в тесте

return new ResourceConfig() 
    .register(new MyResource(myManager)); 
+0

Большое спасибо за ответ. Я внес изменения, как вы предложили, и теперь я могу получить макет объекта в классе MyResource. Подобно классу MyManager, у меня есть и другие классы в классе MyResource. Должен ли я конструировать их только через Contsructor. Извините, что спросила вас снова. Для целей тестового набора мне пришлось включить эти конструкторы. Есть ли другой способ сделать это. – Vijaya

+0

привет @ Виджая, пожалуйста, нажмите на правую галочку, если этот ответ помог вам. (У) – VedX