2016-04-26 43 views
0

当测试Jersey REST OrderResource时,它返回空的List<Order> orders。 Mockito部分似乎因为访问数据库层而工作不正确。如何解决它?Mokito在运行JUnit测试时未与Jersey和Jetty一起工作

测试

public class OrderResourceTest extends JerseyTest { 
    @Mock 
    private OrderService orderServiceMock; 

    @Override 
    protected Application configure() { 
     MockitoAnnotations.initMocks(this); 
     enable(TestProperties.LOG_TRAFFIC); 
     enable(TestProperties.DUMP_ENTITY); 
     //database set up 
     ResourceConfig resourceConfig = new ResourceConfig(OrderResource.class); 

     return resourceConfig; 
    } 

    @Test 
    public void testGetOrders() { 
     when(orderServiceMock.findOrders()).thenReturn(getMockOrders()); 

     Response response = target("/orders") 
      .request() 
      .get(); 
     List <Order> orders = response.readEntity(new GenericType < List <Order>>() {}); 
     assertEquals("Should return status 200", 200, response.getStatus()); 
     assertTrue(orders.size() == 1); // orders.size() is 0. Why? 
    } 


    private List <Order> getMockOrders() { 
     Customer customer = new Customer(1 L, "CompanyName", "Street", "123456", "City", "UK"); 
     List <OrderLine> orderLines = Arrays.asList(new OrderLine(1 L, "s345664lkdLDSDf", "Samsung Galaxy 4", 1)); 
     Order order = new Order(1 L, customer, orderLines); 

     return Arrays.asList(order); 
    } 
} 

project被用作参考

+1

你在哪里指导下测试系统使用'orderServiceMock',而不是你的生产OrderService? –

+0

在目前的测试中,不确定。 –

回答

0

你从这个例子里缺的关键部分是InjectableProvider

class InjectableProvider extends AbstractBinder implements Factory<CustomerService> { 
    @Override 
    protected void configure() { 
     bindFactory(this).to(CustomerService.class).in(Singleton.class); 
    } 

    public CustomerService provide() { 
     return serviceMock; 
    } 

    public void dispose(CustomerService service) { 
     serviceMock = null; 
    } 
} 

这是供应商的工作将模拟注入资源。如果你遵循相同的方法并为你的OrderService定制它,你的模拟应该被调用。

确保您在配置过程中进行注册:

config.register(new InjectableProvider());