首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JMock静态嘲讽与局部嘲弄

JMock静态嘲讽与局部嘲弄
EN

Stack Overflow用户
提问于 2017-12-08 17:08:34
回答 3查看 426关注 0票数 1

我们有大量使用JMock 2.5.1编写的单元测试,而且大多数(全部?)其中使用本地嘲弄对象,如:

代码语言:javascript
复制
@RunWith(JMock.class)
public class SomeTestClass {

    private Mockery context;

    @Before
    public void setUp() {
        context = new Mockery();
    }
}

我们决定升级到JMock 2.8.3,以便我们可以使用新的特性,例如线程安全模拟。但是,在运行在2.8.3下的现有单元测试中,我得到:

代码语言:javascript
复制
Testcase: testReordering_GoingUp(com.hcs.orc.board.NameTagList2Test):   Caused an ERROR
Mockery named 'context' is null
java.lang.IllegalStateException: Mockery named 'context' is null
    at org.jmock.integration.junit4.JMock.mockeryOf(JMock.java:67)
    at org.jmock.integration.junit4.JMock.createTest(JMock.java:35)

看来JMock 2.8.3需要一个静态版本的嘲弄。这就是:

代码语言:javascript
复制
@RunWith(JMock.class)
public class SomeTestClass {

    public static Mockery context;

    @BeforeClass
    public static void globalSetUp() {
        context = new Mockery();
    }
}

然而,这会在测试之间的嘲弄中造成流血。也就是说,即使在测试之后,以前创建的模拟对象仍然存在,从而导致以下错误:

代码语言:javascript
复制
a mock with name fullScreenFrame already exists
java.lang.IllegalArgumentException: a mock with name fullScreenFrame already exists
    at org.jmock.Mockery.mock(Mockery.java:128)
    at org.jmock.Mockery.mock(Mockery.java:120)

有没有办法从JMock 2.5.1升级到JMock 2.8.3而不需要重做1000秒(1000 S)?单元测试?

注:编辑以反映移动到JMock 2.8.3。JMock 2.6.1并不是最新的代码,尽管jmock.org的网站已经过时,而且没有维护。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-12-20 16:44:03

我的解决办法是在我的第一次传球和@Foxsly的回答之间。它允许我移动到JMock 2.8.3,而不需要重写更多的嘲弄声明(并删除@RunWith)。

代码语言:javascript
复制
public class SomeTestClass {

   @Rule
   public JUnitRuleMockery context = new JUnitRuleMockery();

   private SomeOtherClass fullScreenFrame;

   @Before
   public void setUp() {
       fullScreenFrame = context.mock(SomeOtherClass.class);
   }
}
票数 1
EN

Stack Overflow用户

发布于 2017-12-18 22:18:26

尝试删除@RunWith(JMock.class)注释--我认为它与2.6.x版本中的一个版本(以引入JUnitRuleMockery的版本为准)是不可取的。

此外,如果您愿意,可以使用注释实例化您的模拟:

代码语言:javascript
复制
public class SomeTestClass {
    @Rule
    public JUnitRuleMockery context = new JUnitRuleMockery();

    @Mock private SomeOtherClass mockedDependency;

}
票数 1
EN

Stack Overflow用户

发布于 2017-12-11 21:15:52

我可以通过在Test类构造函数中创建嘲弄来解决这个问题。然后它就存在于JMock查找中,但是它将在每次测试运行时被刷新。

可能围绕以下方面开展工作:

代码语言:javascript
复制
@RunWith(JMock.class)
public class SomeTestClass {

    private Mockery context;

    public SomeTestClass() {
         context = new Mockery();
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47719072

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档