我正在尝试模拟一个看起来像这样的DAO层接口...
public interface DummyDAO{
public List<VO> getSearchCriteria(String Id, Integer version) throws Exception;
}
在实现部分中,我运行一个查询,它根据该查询获取一个Value对象列表。如何模拟来自数据库的VO列表。有一个简单的方法吗?我试图鼓励我的团队使用Jmockit,但我仍然是这个嘲弄工具的新手。如果您需要更多信息,请告诉我。
由于
答案 0 :(得分:2)
这里的答案部分取决于CUT(被测代码)如何使用List<VO>
。例如,如果您的代码是仅作为代理的RESTful服务并将此List<VO>
返回给用户,而不检查内容或任何内容,那么这就足够了:
@Tested CUT cut;
@Injectable DummyDAO dao;
@Injectable List<VO> res;
@Test
public void testSomething() throws Exception {
new Expectations() {{
dao.getSearchCriteria(anyString, anyInt); result = res;
}};
List<VO> output = cut.methodBeingTested();
// assertions go here, like that output and res are the same
// you can also put Verifications here
}
如果您希望对VO
进行分析,那么事情会变得更加复杂,例如:
@Tested CUT cut;
@Injectable DummyDAO dao;
@Mocked VO vo;
@Test
public void testSomething() throws Exception {
final List<VO> res = new ArrayList<VO>();
Collections.addAll(res, vo, vo, vo, vo);
new Expectations() {{
dao.getSearchCriteria(anyString, anyInt); result = res;
}};
new Expectations(4) {{
vo.getFoo(); returns(5, 47, 13, -7);
}};
cut.methodBeingTested();
// assertions go here, like that you handled the negative number properly
// you can also put Verifications here
}
请注意,我没有嘲笑List
- 如果你正在进行更复杂的操作,最好坚持使用真实的List
,而不必嘲笑它的所有操作。我嘲笑一个单独的VO并将其多次添加到列表中 - 这是可以的,因为每次检查它时它会采取不同的行为,因此看起来是不同的VO
。
考试,因为它发生了4次,我搬到了另一个Expectations
区块,因为你期望它发生4次。我只是这样做是为了炫耀期望块,因为在这种情况下,通过在原始块中使用vo.getFoobar(); times=4; returns(5, 47, 13, -7);
可以很容易地实现...或者,第二个块可能看起来像
new StrictExpectations(4) {{
vo.getFoo(); returns(5, 47, 13, -7);
vo.getBar(); returns("foo", "bar", "baz", "quux");
}};
在这种情况下,times
字段不起作用,您必须将其放在一个单独的块中 - 此块表示它希望getFoo()
和{{1} }调用,交替,恰好4次 - 如果你想在每次迭代列表并查看这两个属性时想要做的话。
我希望我能给你一些思考的食物;在不了解您的具体用例的情况下,我自己可以更具体。
答案 1 :(得分:0)
一种简单的方法是使用Mockito.spy()。间谍方法创建实例的代理,使您有机会模拟一种方法的行为。
您可以创建一个在调用dao方法时返回的列表。
示例:
yourDao = spy(new YourDaoImplementation())
doReturn(yourExampleList).when(yourDao).getSearchCriteria(any(String.class), any(Integer.class));
如果你真的想测试你的dao,你可以使用轻量级数据库作为HSQLDB