带有Jersey测试和JAX-RS的Mockito-UnsatisfiedDependencyException

时间:2018-06-30 14:05:50

标签: java mockito jersey-test-framework

尝试测试一个相当简单的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();
    }
}

使用Mockito和Jersey测试

@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.UnsatisfiedDependencyExceptionLogger的{​​{1}},甚至认为依赖项是Mockito正确注入的。

似乎Grizzly正正确地尝试改变Mockito模拟。 如果我在EjbService方法中注册了AbstractBinder,一切正常。

configure

但是我不认为这是完成注射的最佳方法。 Mockito风格更好,恕我直言。 我该怎么做才能解决这个问题?

1 个答案:

答案 0 :(得分:0)

MockitoJUnitRunner用于单元测试,JerseyTest用于集成测试。

使用Mockito时,您的测试将直接调用已声明的myRestService,并且将进行Mockito依赖项注入。

使用JerseyTest时,将创建一个新的Web容器,并且您的测试将通过HTTP调用与MyRestService通信。在该容器内,发生了真正的依赖注入,这些类甚至都没有看到您声明了模拟。

您可以完全像以前那样一起使用JerseyTest和Mockito。它只需要一些额外的配置(如您所见),就不需要@RunWith注释。