我目前正在做一些使用EasyMock的测试用例。我的示例代码如下所示:
{
dao = EasyMock.createNiceMock(Dao.class);
initObj();
EasyMock.replay(dao);
// EasyMock.verify(dao);
mapper = new Mapper();
mapper.setDao(dao);
}
@Test
public void testmapper(){
mapper.map();
}
public void initObj() {
Obj o = new Obj();
o.setX(2);
EasyMock.expect(dao.findObj(1)).andReturn(o);
}
class Mapper {
@Autowired
private Dao dao;
public Obj map(){
Obj o = dao.findObj(1);
System.out.println(o.getX());
return o;
}
//getter and setter
}如果我实际调用EasyMock.verify(dao);,它会抛出
java.lang.AssertionError:
Expectation failure on verify:
dao.findObj(1): expected: 1, actual: 0
at org.easymock.internal.MocksControl.verify(MocksControl.java:183)
at org.easymock.EasyMock.verify(EasyMock.java:2142)
...如果我不调用verify,我在Obj上的Mapper类中的第一次调用会导致NPE。我对EasyMock非常陌生,还找不到为什么它没有返回我在initObj中创建的Obj的原因。任何启发都是受欢迎的。我读了一些关于这个主题的问题和一些简单的教程,但它们对我没有帮助
发布于 2017-07-13 21:51:52
我找到了解决我的问题的办法。在我的initObj()方法中,我还必须定义预期行为的调用次数,如下所示:
public void initObj() {
Obj o = new Obj();
o.setX(2);
EasyMock.expect(dao.findObj(1)).andReturn(o).times(1);
}我仍然不明白没有times(1)它怎么能工作。我有一些来自一个同事的示例代码,它只需使用EasyMock.expect(dao.findObj(1)).andReturn(o);即可工作
发布于 2017-07-17 05:26:12
verify应该在您的测试之后。所以在mapper.map()之后。它用于验证是否进行了所有预期的调用。所以它发生在结尾是有意义的。
然后,使用您提供的代码绝对不可能获得NPE。除非你对getX和setX有什么问题。这是我的代码版本。它工作得很完美。
public class MyTest {
private final Dao dao;
private final Mapper mapper;
{
dao = EasyMock.createNiceMock(Dao.class);
initObj();
EasyMock.replay(dao);
// EasyMock.verify(dao);
mapper = new Mapper();
mapper.setDao(dao);
}
@Test
public void testmapper(){
mapper.map();
EasyMock.verify(dao);
}
public void initObj() {
Obj o = new Obj();
o.setX(2);
EasyMock.expect(dao.findObj(1)).andReturn(o);
}
class Mapper {
private Dao dao;
public Obj map(){
Obj o = dao.findObj(1);
System.out.println(o.getX());
return o;
}
public void setDao(Dao dao) {
this.dao = dao;
}
}
class Obj {
private int x;
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
}
interface Dao {
Obj findObj(int i);
}
}https://stackoverflow.com/questions/45079720
复制相似问题