【问题标题】:how to return different values from a mocked method in Jmockit?如何从 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 来注入依赖项。

【问题讨论】:

    标签: java junit jmockit


    【解决方案1】:

    是的,我能想到两种可能的方法。

    1. 将您的模拟代码封装在一个方法中并从不同的方法调用它 方法

    public void setUpMocksForService2(final List<String>
        stringList) {
            new MockUp<Service2Local>(){
                @Mock
                public void $init() {
                }
                @Mock
                public List<String> search(){
                    return stringList;
                }
            }.getMockInstance(); 
    

    } 并从您的不同测试方法中调用它。这里的缺点是每次都会创建一个新的模型。

    1. 调用上述方法一次@BeforeClass 并使字符串列表成为测试类的成员,在每个测试用例中相应地修改此列表。

    离题注意:您还可以使用期望来模仿模仿的何时和然后的行为

    【讨论】:

    • 感谢您的回答。我对 Expectations API 不是很熟悉,我会试试的。期望似乎更合适。我尝试了方法#1,但它不起作用,因为任何通用方法中指定的 Mocks 都不起作用。我猜,mocks 只需要在 Before 方法中指定,At_Before 方法不能带任何参数,所以我不能在列表中传递。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多