EasyMock - inna wartość niż oczekuję

0

Mam następujący test

 private IWarehouse mockWarehouse;

    @Before
    public void setUp() throws Exception {
        mockWarehouse = EasyMock.createMock(Warehouse.class);
        crane.setWarehouse(mockWarehouse);
    }
...
@Test(expected = FullWarehouseException.class)
    public void testPlacePackageWhenWarehouseIsFull(){
        Package packageToPlace = new Package("123");
        EasyMock.expect(mockWarehouse.placePackage(packageToPlace)).andReturn(true);
        EasyMock.replay();
        crane.placePackage(packageToPlace);
    }

Crane to mój serwis, a Warehouse - dao. Ustawiam setterem mocka warehouse i oczekuję, że zwróci true. Tymczasem logowanie zwraca false..

Crane:

 public void placePackage(Package p) {
        logger.info("placePackage");
        if (isValid(p)) {
            logger.info("placePackage isValid");
            logger.info(warehouse.placePackage(p));
            //if (!warehouse.placePackage(p)) {
            //    throw new FullWarehouseException();
           // }
        }
    }

Jak można oczekiwać otrzymuję logi:
placePackage
placePackage isValid
false

Nie rozumiem, czemu zwraca mi false skoro mockuję, że ma być true.
Wiem, że to czego test oczekuje ma się aktualnie nijak do czego mockuję, bo nie rzuci wyjątkiem, jeśli zwróci true. Debuguję sobie po prostu. Wychodzi aktualnie, że uparcie zwraca false mimo mockowania na true i już wymiękam. Liczę, że ktoś świeżym okiem spojrzy i zauważy co jest nie tak.

0

Test wygląda dobrze, używasz odpowiedniego runnera? Jak testujesz z EasyMockiem to klasa testowa powinna być adnotowana @RunWith(EasyMockRunner.class)

0

Nie miałem tej adnotacji, ale niestety nic nie zmieniła

0

A dodaj na koniec testu jeszcze weryfikacje tego mocka, żeby się upewnić że w ogóle to się wykonało. Możesz tam też wejść debugerem i zobaczyć co się dzieje. Dodałbym też po .andReturn(true) .anyTimes();

0

Nie pierwszy raz tworzę mocka, ale przy tym wymiękam co się dzieje

 java.lang.IllegalStateException: missing behavior definition for the preceding method call:
Warehouse.getPackageByNumber("123")
Usage is: expect(a.foo()).andXXX()
 @Test(expected = FullWarehouseException.class)
    public void testPlacePackageWhenWarehouseIsFull() {
        Package packageToPlace = new Package("123");
        IWarehouse mockWarehouse = EasyMock.createMock(Warehouse.class);
        EasyMock.expect(mockWarehouse.placePackage(packageToPlace)).andReturn(true).anyTimes();
        EasyMock.expect(mockWarehouse.getPackageByNumber(packageToPlace.getNumber())).andReturn(null).anyTimes();
        EasyMock.replay();
        crane.setWarehouse(mockWarehouse);
        crane.placePackage(packageToPlace);
    }
 public void placePackage(Package p) {
        if (isValid(p)) {
            if (!warehouse.placePackage(p)) {
                throw new FullWarehouseException();
            }
        }
    }

    private boolean isValid(Package p) {
        if (p.getNumber() == null || p.getNumber().isEmpty()) {
            throw new EmptyPackageNumberException();
        }
        if (warehouse.getPackageByNumber(p.getNumber()) != null) {
            throw new DuplicatedPackageNumberException();
        }
        return true;
    }
1

Nie taki easy ten easy mock :)

Nie używałem nigdy tego ale pierwsze lepsze tutoriale pokazują że powinieneś w tym replay'u podać jako argument mockowany serwis.

EasyMock.replay(mockWarehouse);
0

Jak mogłem to przeoczyć skoro w innym teście jest. Dzięki kolego

1 użytkowników online, w tym zalogowanych: 0, gości: 1