如何从Jmockit中的模拟方法返回不同的值?

时间:2015-10-30 07:19:45

标签: java junit jmockit

我遇到需要对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中,我可以通过在依赖模拟对象的test方法中调用when()。thenReturn()来实现这一点。

我正在使用@Injectable来注入依赖项。

1 个答案:

答案 0 :(得分:1)

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

  1. 将您的模拟代码包装在一个方法中,并从不同的方法调用它 方法
  2. public void setUpMocksForService2(final List<String>
        stringList) {
            new MockUp<Service2Local>(){
                @Mock
                public void $init() {
                }
                @Mock
                public List<String> search(){
                    return stringList;
                }
            }.getMockInstance(); 
    

    public void setUpMocksForService2(final List<String> stringList) { new MockUp<Service2Local>(){ @Mock public void $init() { } @Mock public List<String> search(){ return stringList; } }.getMockInstance(); 并从您的不同测试方法中调用此方法。这里的缺点是每次都会创建一个新的模拟。

    1. 调用@BeforeClass上面的方法并使字符串列表成为测试类的成员,在每个测试用例中相应地修改此列表。
    2. 偏离主题注意:您还可以使用期望模仿mockito

      的时间和行为