尝试测试一个相当简单的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.UnsatisfiedDependencyException
和Logger
的{{1}},甚至认为依赖项是Mockito正确注入的。
似乎Grizzly正正确地尝试改变Mockito模拟。
如果我在EjbService
方法中注册了AbstractBinder
,一切正常。
configure
但是我不认为这是完成注射的最佳方法。 Mockito风格更好,恕我直言。 我该怎么做才能解决这个问题?
答案 0 :(得分:0)
MockitoJUnitRunner
用于单元测试,JerseyTest
用于集成测试。
使用Mockito时,您的测试将直接调用已声明的myRestService
,并且将进行Mockito依赖项注入。
使用JerseyTest时,将创建一个新的Web容器,并且您的测试将通过HTTP调用与MyRestService
通信。在该容器内,发生了真正的依赖注入,这些类甚至都没有看到您声明了模拟。
您可以完全像以前那样一起使用JerseyTest和Mockito。它只需要一些额外的配置(如您所见),就不需要@RunWith
注释。