JMock 静态 Mockery 与本地 Mockery
JMock static Mockery vs. local Mockery
我们有大量使用 JMock 2.5.1 编写的单元测试,其中大部分(全部?)使用本地 Mockery 对象,例如:
@RunWith(JMock.class)
public class SomeTestClass {
private Mockery context;
@Before
public void setUp() {
context = new Mockery();
}
}
我们决定升级到 JMock 2.8.3,这样我们就可以使用线程安全模拟等新功能。但是,使用 2.8.3 下的现有单元测试 运行,我得到:
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 似乎需要 Mockery 的静态版本。即:
@RunWith(JMock.class)
public class SomeTestClass {
public static Mockery context;
@BeforeClass
public static void globalSetUp() {
context = new Mockery();
}
}
但是,这会在测试之间的 Mockery 中造成溢出。即之前创建的 mock 对象在测试后仍然存在,导致错误如:
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 而无需重新进行 100 秒(1000 秒?)的单元测试?
注意: 编辑以反映移动到 JMock 2.8.3。 JMock 2.6.1 不是最新的代码,尽管 jmock.org 的网站已经过时且无人维护。
我可以通过在 Test 类 构造函数中创建 Mockery 来解决这个问题。然后它存在于 JMock 中寻找它,但它会为每个测试刷新 运行。
可能的解决方法:
@RunWith(JMock.class)
public class SomeTestClass {
private Mockery context;
public SomeTestClass() {
context = new Mockery();
}
}
尝试删除 @RunWith(JMock.class)
注释 - 我相信它已被 2.6.x 版本之一弃用(以引入 JUnitRuleMockery 的版本为准)。
除此之外,如果您愿意,您可以使用注释来实例化您的模拟:
public class SomeTestClass {
@Rule
public JUnitRuleMockery context = new JUnitRuleMockery();
@Mock private SomeOtherClass mockedDependency;
}
我确定的解决方法是在我的第一次通过和@Foxsly 的回答之间。它允许我转移到 JMock 2.8.3 而无需重写我的 Mockery 声明(并删除 @RunWith
)。
public class SomeTestClass {
@Rule
public JUnitRuleMockery context = new JUnitRuleMockery();
private SomeOtherClass fullScreenFrame;
@Before
public void setUp() {
fullScreenFrame = context.mock(SomeOtherClass.class);
}
}
我们有大量使用 JMock 2.5.1 编写的单元测试,其中大部分(全部?)使用本地 Mockery 对象,例如:
@RunWith(JMock.class)
public class SomeTestClass {
private Mockery context;
@Before
public void setUp() {
context = new Mockery();
}
}
我们决定升级到 JMock 2.8.3,这样我们就可以使用线程安全模拟等新功能。但是,使用 2.8.3 下的现有单元测试 运行,我得到:
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 似乎需要 Mockery 的静态版本。即:
@RunWith(JMock.class)
public class SomeTestClass {
public static Mockery context;
@BeforeClass
public static void globalSetUp() {
context = new Mockery();
}
}
但是,这会在测试之间的 Mockery 中造成溢出。即之前创建的 mock 对象在测试后仍然存在,导致错误如:
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 而无需重新进行 100 秒(1000 秒?)的单元测试?
注意: 编辑以反映移动到 JMock 2.8.3。 JMock 2.6.1 不是最新的代码,尽管 jmock.org 的网站已经过时且无人维护。
我可以通过在 Test 类 构造函数中创建 Mockery 来解决这个问题。然后它存在于 JMock 中寻找它,但它会为每个测试刷新 运行。
可能的解决方法:
@RunWith(JMock.class)
public class SomeTestClass {
private Mockery context;
public SomeTestClass() {
context = new Mockery();
}
}
尝试删除 @RunWith(JMock.class)
注释 - 我相信它已被 2.6.x 版本之一弃用(以引入 JUnitRuleMockery 的版本为准)。
除此之外,如果您愿意,您可以使用注释来实例化您的模拟:
public class SomeTestClass {
@Rule
public JUnitRuleMockery context = new JUnitRuleMockery();
@Mock private SomeOtherClass mockedDependency;
}
我确定的解决方法是在我的第一次通过和@Foxsly 的回答之间。它允许我转移到 JMock 2.8.3 而无需重写我的 Mockery 声明(并删除 @RunWith
)。
public class SomeTestClass {
@Rule
public JUnitRuleMockery context = new JUnitRuleMockery();
private SomeOtherClass fullScreenFrame;
@Before
public void setUp() {
fullScreenFrame = context.mock(SomeOtherClass.class);
}
}