【问题标题】:Jmock unexpected method invocation, cannot see whyJmock 意外的方法调用,不明白为什么
【发布时间】:2013-02-25 16:21:11
【问题描述】:

我有以下方法....

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

}

在我的测试中我有:

protected final Car 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) 没有指定期望:你... - 忘记以基数从句开始期望? - 调用模拟方法来指定期望的参数?

【问题讨论】:

  • 这段代码还能编译吗?您不会关闭 Expectations 实现或对 checking 的调用。此外,您对testa 的调用传递了一个Car 对象,但testa 不带任何参数。您能否将代码缩小到特定的失败案例,然后发布文件的全部内容?
  • 是的,它都可以编译......我是手写的,因为我的代码中有很多 cmets......

标签: java jmock


【解决方案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);
    }
}

【讨论】:

  • 谢谢这对我有所帮助....我认为我遇到的问题是由于应用了泛型...所以我现在创建了一个实例并检查该实例,而不是模拟汽车。 .
  • 这是有道理的。我当时没有考虑,但你的车不是合作者,那为什么不实例化呢?很高兴我能帮上忙。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-29
  • 2020-08-07
  • 2018-06-30
相关资源
最近更新 更多