如何从 Jmockit 中的模拟方法返回不同的值?
Posted
技术标签:
【中文标题】如何从 Jmockit 中的模拟方法返回不同的值?【英文标题】:how to return different values from a mocked method in Jmockit? 【发布时间】:2016-01-30 13:31:22 【问题描述】:我遇到需要对 EJB 方法进行单元测试的情况。目标 EJB 依赖于另一个 EJB,例如,
@Stateless(name = "service1")
@Interceptors(FaultBarrierInterceptor.class)
public class Service1 implements Service1Remote
@EJB(beanName = "service2")
private Service2Local service2;
Service2Local 是本地 EJB 接口,我在 Junit 的 @Before 方法中模拟如下方法,
new MockUp<Service2Local>()
@Mock
public void $init()
@Mock
public List<String> search()
return List_1;
.getMockInstance();
是否可以在不同的测试方法(例如 List_2 )中获得不同的列表(来自模拟的 search() 方法)?我希望这个 search() 方法在不同的 @Test 方法中返回不同的值。
我在我的测试方法中尝试了一个新的 MockUp,但没有奏效。 在 Mockito 中,我可以通过在依赖模拟对象的测试方法中调用 when().thenReturn() 来实现这一点。
我正在使用@Injectable 来注入依赖项。
【问题讨论】:
【参考方案1】:是的,我能想到两种可能的方法。
-
将您的模拟代码封装在一个方法中并从不同的方法调用它
方法
public void setUpMocksForService2(final List<String>
stringList)
new MockUp<Service2Local>()
@Mock
public void $init()
@Mock
public List<String> search()
return stringList;
.getMockInstance();
并从您的不同测试方法中调用它。这里的缺点是每次都会创建一个新的模型。
-
调用上述方法一次@BeforeClass 并使字符串列表成为测试类的成员,在每个测试用例中相应地修改此列表。
离题注意:您还可以使用期望来模仿模仿的何时和然后的行为
【讨论】:
感谢您的回答。我对 Expectations API 不是很熟悉,我会试试的。期望似乎更合适。我尝试了方法#1,但它不起作用,因为任何通用方法中指定的 Mocks 都不起作用。我猜,mocks 只需要在 Before 方法中指定,At_Before 方法不能带任何参数,所以我不能在列表中传递。以上是关于如何从 Jmockit 中的模拟方法返回不同的值?的主要内容,如果未能解决你的问题,请参考以下文章
JMockit - 期望 - 匹配包含模拟对象作为参数的方法调用