pmc*_*255 6 java methods junit static jmockit
我有一个静态方法的类,我目前正在使用JMockit进行模拟.说它看起来像:
public class Foo {
public static FooValue getValue(Object something) {
...
}
public static enum FooValue { X, Y, Z, ...; }
}
Run Code Online (Sandbox Code Playgroud)
我有另一个类(让我们称之为MyClass)调用Foo的静态方法; 我正在尝试为这个类编写测试用例.我的JUnit测试,使用JMockit,看起来像这样:
public class MyClassTest extends TestCase {
@NonStrict private final Foo mock = null;
@Test public void testMyClass() {
new Expectations() {
{
Foo.getValue((Object) any); result = Foo.FooValue.X;
}
};
}
myClass.doSomething();
}
Run Code Online (Sandbox Code Playgroud)
这工作正常,花花公子,当测试执行时,我的MyClass实例将在调用Foo.getValue()时正确获取Foo.FooValue.X的枚举值.
现在,我正在尝试迭代枚举中的所有值,并重复运行测试.如果我将上面的测试代码放在for循环中并尝试将模拟静态方法的结果设置为每个枚举值,那么这不起作用.Foo.getValue()的模拟版本总是返回Foo.FooValue.X,并且在迭代枚举时从不返回任何其他值.
如何在单个JUnit测试中多次模拟静态方法?我想做这样的事情(但显然它不起作用):
public class MyClassTest extends TestCase {
@NonStrict private final Foo mock = null;
@Test public void testMyClass() {
for (final Foo.FooValue val : Foo.FooValue.values() {
new Expectations() {
{
// Here, I'm attempting to redefine the mocked method during each iteration
// of the loop. Apparently, that doesn't work.
Foo.getValue((Object) any); result = val;
}
};
myClass.doSomething();
}
}
}
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
您应该在一次录制中记录多个连续的返回值,而不是"多次模拟该方法":
public class MyClassTest extends TestCase
{
@Test
public void testMyClass(@Mocked Foo anyFoo)
{
new Expectations() {{
Foo.getValue(any);
result = Foo.FooValue.values();
}};
for (Foo.FooValue val : Foo.FooValue.values() {
myClass.doSomething();
}
}
}
Run Code Online (Sandbox Code Playgroud)
Delegate如果需要更大的灵活性,也可以使用a来完成.
| 归档时间: |
|
| 查看次数: |
10096 次 |
| 最近记录: |