与Mockito模拟界面

Mik*_*ike 14 java mockito

有人可以帮助我使用下面的Mock对象.我想为ServiceImpl类编写一个模拟测试用例.我想模拟OrderIF接口:

public interface OrderIF{
    List<Order> ordersFor(String type);
}
Run Code Online (Sandbox Code Playgroud)

服务的实施是:

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)
    }
}
Run Code Online (Sandbox Code Playgroud)

我的代码给出了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);
    }
}
Run Code Online (Sandbox Code Playgroud)

Ser*_*hyr 7

@InjectMocks不会实例化或嘲笑你的课程.此注释用于将模拟注入此字段.

如果你想测试serviceImpl你将需要以这种方式模拟:

@Mock
private OrderIF order;

@InjectMocks
private Service reqService = new ServiceImpl(); 
Run Code Online (Sandbox Code Playgroud)

为了使它工作,你要么需要使用转轮或MockitoAnnotations.initMocks(this);@Before方法.


Jon*_*han 6

我猜这order就是null你得到的NullPointerException

when(order.ordersFor(type)).thenReturn(ll);
Run Code Online (Sandbox Code Playgroud)

为了@InjectMocks工作并实例化您的类,您需要添加一个运行程序:

@RunWith(MockitoJUnitRunner.class)
public class ServiceImplTest {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

您不必使用运行器,请参阅替代方案的文档