Mockito с тестом на Джерси и JAX-RS - UnsatisfiedDependencyException - PullRequest
0 голосов
/ 30 июня 2018

Попытка протестировать довольно простую конечную точку JAX-RS

@ApplicationScoped
@Path("mypath")
public class MyRestService {
    @Inject
    private Logger logger;

    @Inject
    private EjbService ejbService;

    @GET
    public String myMethod() {
        logger.info("...");
        return ejbService.myMethod();
    }
}

с тестом Мокито и Джерси

@RunWith(MockitoJUnitRunner.class)
public class MyRestServiceTest extends JerseyTest {
    @Mock
    private EjbService ejbService;

    @Mock
    private Logger logger;

    @InjectMocks
    private MyRestService myRestService;

    ...

    @Override
    protected Application configure() {
        MockitoAnnotations.initMocks(this);
        return new ResourceConfig().register(myRestService);
    }
}

Контейнер Grizzly возвращает org.glassfish.hk2.api.UnsatisfiedDependencyException для Logger и EjbService даже при том, что зависимости корректно введены Mockito.

Кажется, Гризли пытается, правильно, оверрайдить макеты Mockito. Если я регистрирую AbstractBinder в методе configure, все работает нормально.

.register(new AbstractBinder() {
    @Override
    protected void configure() {
        bind(ejbService).to(EjbService.class);
        bind(logger).to(Logger.class);
    }
});

Но я не чувствую, что это лучший способ сделать инъекцию. Стиль Мокито лучше имхо. Что мне нужно сделать, чтобы решить эту проблему?

1 Ответ

0 голосов
/ 30 июня 2018

MockitoJUnitRunner для модульных тестов и JerseyTest для интеграционных тестов.

При использовании Mockito ваши тесты будут напрямую вызывать объявленную myRestService, и произойдет внедрение зависимостей Mockito.

При использовании JerseyTest создается новый веб-контейнер, и ваши тесты общаются с MyRestService через HTTP-вызов. Внутри этого контейнера происходит настоящая инъекция зависимостей, классы даже не видят, что вы объявили имитацию.

Вы можете использовать JerseyTest и Mockito вместе, точно так же, как и вы. Это просто требует дополнительных настроек (как вы уже нашли), и аннотация @RunWith не требуется.

...