Неожиданный вызов метода Jmock, не понимаю, почему

У меня есть такой способ ....

public void testa(Car car) {
   em.persist(car);
   car.setEngine(null);

}

в моем тесте у меня есть:

защищенный финальный автомобиль mockCar = context.mock (Car.class);

@Test
public void testCar() {
        context.checking(new Expectations() {
            {
                oneOf(em).persist(car);
                oneOf(car).setEngine(null);

                   }
             });
        this.stacker.testa(mockCar);
        context.assertIsSatisfied(); 

}

Я запускаю это и получаю:

неожиданный вызов car.setEngine (null) ...

Если я удалю код, который устанавливает двигатель в коде, и из теста тесты пройдут ... я совершенно не понимаю, почему это происходит ...

исключение:

java.lang.AssertionError: неожиданный вызов: car.setEngine (null) никаких ожиданий не указано: вы ... - забыли начать ожидание с предложения мощности? - вызвать фиктивный метод, чтобы указать параметр ожидания?


person user1555190    schedule 25.02.2013    source источник
comment
Этот код вообще компилируется? Вы не закрываете реализацию Expectations или вызов checking. Кроме того, ваш вызов testa передает объект Car, но testa не принимает никаких параметров. Можете ли вы сузить код до конкретного случая сбоя, а затем опубликовать все содержимое файла (ов), пожалуйста?   -  person Samir Talwar    schedule 25.02.2013
comment
да, все компилируется .... я писал это вручную, так как у меня было много комментариев в моем коде ...   -  person user1555190    schedule 25.02.2013


Ответы (1)


Кажется, ваша проблема в том, что у вас есть два Car объекта. У вас есть car, на который вы устанавливаете ожидания, и mockCar, через который вы проходите. Не видя определений этих объектов, я не могу сказать наверняка, но, вероятно, это корень вашей проблемы.

Если проблема не в этом, нам понадобится больше кода. Желательно весь файл (ы).

Для справки, это хорошо компилируется и проходит тесты:

import org.jmock.Expectations;
import org.jmock.Mockery;
import org.junit.Test;

public class TestyMcTestTest {
    private final Mockery context = new Mockery();

    private final EntityManager em = context.mock(EntityManager.class);
    private final Stacker stacker = new Stacker(em);
    private final Car mockCar = context.mock(Car.class);

    @Test
    public void testCar() {
        context.checking(new Expectations() {{
            oneOf(em).persist(mockCar);
            oneOf(mockCar).setEngine(null);
        }});
        this.stacker.testa(mockCar);
        context.assertIsSatisfied();
    }

    public interface Car {
        void setEngine(Engine engine);
    }

    public interface Engine { }

    public class Stacker {
        private final EntityManager em;

        public Stacker(EntityManager em) {
            this.em = em;
        }

        public void testa(Car car) {
           em.persist(car);
           car.setEngine(null);
        }
    }

    private interface EntityManager {
        void persist(Object o);
    }
}
person Samir Talwar    schedule 25.02.2013
comment
Спасибо, это немного помогло мне .... я думаю, что проблема, с которой я столкнулся, была связана с применением generica ... поэтому вместо того, чтобы издеваться над автомобилем, я теперь создал экземпляр и проверил этот экземпляр ... - person user1555190; 26.02.2013
comment
В этом есть смысл. В то время я не думал об этом, но ваша машина не является соавтором, так почему бы не создать ее экземпляр? Рад, что помог. - person Samir Talwar; 26.02.2013