如何从 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 - 期望和静态方法

JMockit - 期望 - 匹配包含模拟对象作为参数的方法调用

用jmockit模拟扩展类的抽象方法

如何使用Jmockit模拟JdbcTemplate.update?

JMockit 基础:模拟对象、模拟参数、期望

在Jmockit停止嘲笑