![](/img/trans.png)
[英]mockito - mocking an interface - throwing NullPointerException
[英]Mocking an interface with Mockito
有人可以帮我处理下面的 Mock 对象。 我想为 ServiceImpl 类编写一个模拟测试用例。 我想模拟 OrderIF 接口:
public interface OrderIF{
List<Order> ordersFor(String type);
}
服务的实现是:
public class ServiceImpl implements Service {
private List <Order> orders ;
private OrderIF orderif ; // this is 3rd party interface
public int getval(String type) {
//some code
// this returns a list of objects (orders)
orders = orderif.ordersFor(type);
// some code
return orders.get(0)
}
}
我的代码给出 NullPoinerException:
public class ServiceImplTest {
private List <Order> ll ;
private service reqService ;
@InjectMocks
private orderIF order;
@Before
public void setUp() throws Exception {
ll = new ArrayList<Order> ();
ll.add(new Order("Buy" , 11 , "USD" ));
ll.add(new Order("Sell" , 22 , "USD" ));
reqService = spy(new ServiceImpl());
}
@Test
public void test() {
String type= "USD" ;
when(order.ordersFor(type)).thenReturn(ll);
q = reqService.getval(type);
assertTrue(q.get().ask == 232.75);
}
}
@InjectMocks
不会实例化或模拟您的课程。 此注释用于将模拟注入此字段。
如果你想测试serviceImpl
你将需要以这种方式模拟:
@Mock
private OrderIF order;
@InjectMocks
private Service reqService = new ServiceImpl();
要使其工作,您需要使用 runner 或MockitoAnnotations.initMocks(this);
在@Before
方法中。
我猜这个order
是null
的,你在这里得到NullPointerException
:
when(order.ordersFor(type)).thenReturn(ll);
要使@InjectMocks
工作并实例化您的类,您需要添加一个运行器:
@RunWith(MockitoJUnitRunner.class)
public class ServiceImplTest {
// ...
}
您不必使用跑步者,请参阅文档以获取替代方案。
@InjectMocks
在界面上不起作用。 它需要具体的类来使用。
此外, @InjectMocks
用于将模拟注入指定的类,@ @Mock
用于创建需要注入的类的模拟。
因此,要使您的案例起作用,您必须进行以下更改
@Mock
private OrderIF order;
@InjectMocks
private ServiceImpl reqService;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.