2016-04-26 9 views
0

Beim Testen von Jersey REST OrderResource wird List<Order> orders leer zurückgegeben. Der Mockito-Teil scheint falsch zu funktionieren, da er auf den Datenbank-Layer zugreift. Wie man es repariert?Mokito funktioniert nicht mit Jersey und Jetty, während JUnit-Tests ausgeführt werden

-Test

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); 
    } 
} 

Diese project als Referenz verwendet wurde

+1

Wo sehen Sie Ihr System unter Test anweisen zu verwenden 'orderServiceMock' anstatt Ihre Produktion Order? –

+0

Im aktuellen Test nicht sicher. –

Antwort

0

Der wichtigste Teil Sie aus dem Beispiel sind fehlt, ist die 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; 
    } 
} 

Es die Aufgabe des Providers um den Schein in die Ressource zu injizieren. Wenn Sie demselben Ansatz folgen und ihn für Ihre OrderService anpassen, sollte Ihr Mock aufgerufen werden.

Stellen Sie sicher, dass es bei der Konfiguration registrieren:

config.register(new InjectableProvider());