我正在尝试使用Mockito。
我有一个班级
@Provider
public class SessionProvider implements InjectableProvider<Bind, Type>{
@Override
public ComponentScope getScope() {
return ComponentScope.PerRequest;
}
@Override
public Injectable getInjectable(ComponentContext ic, Bind bind, Type parameter) {
return new SessionInjectable();
}
}
尝试在调用getInjectable时返回null。
我的用例就是这样
public void addProvider(Class<?> klass) {
providers.add(klass);
}
addProvider(SessionProvider.class);
如何成功模拟SessionProvider.class?
由于
编辑:
我的课程是这样的:
@Path("message")
@Produces(MediaType.APPLICATION_JSON)
public class MessageResource {
@POST
@Path("post")
public String testPostMessage(@Bind Session session, Message message) {
return "posted";
}
}
绑定注释正在使用我的提供程序。但我当前的框架不接受SessionProvider的实例。它正在使用Class实例。
顺便说一下,这是一个Web服务。它由我的客户端实现调用。我想用模拟会话来测试我的消息。并且对于每个请求,请求新的请求。这就是该方法接受Session Class而不是Session Instance的原因。
我真的开始觉得有什么不对,但在哪里?
由于
答案 0 :(得分:1)
默认情况下,模拟返回null
:
SessionProvider sessionProvider = mock(SessionProvider.class);
assertNull(sessionProvider.getInjectable(ic, bind, parameter));
对于单元测试,您可以通过使用模拟调用MessageResource
来测试testPostMessage
:
messageResource.testPostMessage(mock(SessionMessage.class), mock(Message.class));
或者,您可以创建一个模拟SessionProvider
类,返回模拟Session
:
@Provider
public class MockSessionProvider implements InjectableProvider<Bind, Type>{
public Injectable getInjectable(ComponentContext ic, Bind bind, Type parameter) {
return mock(Session.class);
}
}
然后在框架上注册:
addProvider(MockSessionProvider.class);