我有一个简单的获取-设置界面:
public interface Foo {
void setBaz(String baz);
String getProcessedBaz();
}
该接口(interface)是我所测试的实际类的依赖项。我正在尝试模拟 Foo
拥有这种有效的行为:
public class MockedFoo implements Foo {
private String bazField;
@Override
public void setBaz(String baz) {
bazField = baz;
}
@Override
public String getProcessedBaz() {
return "PROCESSED_" + bazField;
}
}
所以我的预期结果是:
mockedFoo.setBaz("ABC");
assertEquals("PROCESSED_ABC", mockedFoo.getProcessedBaz());
我能够使用 withCapture
捕获方法参数在 Verification
,但是我如何设置 Expectation
具有相同的输入值?看来您可以选择其中之一。
有没有办法在 JMockIt 中表达这一点?我正在使用最新版本(1.9)。
注意:我知道我可以简单地设置 Mockup<Foo>
实例并放入上面的所有代码。然而,我的真实代码要复杂得多,我不想手工制作整个模拟类。
最佳答案
您可以使用委托(delegate)来完成此操作。你可以试试这个
要测试的类
public interface Foo {
void setBaz(String baz);
String getProcessedBaz();
}
class FooSubClass implements Foo {
private String bazField;
@Override
public void setBaz(String baz) {
bazField = null;
}
@Override
public String getProcessedBaz() {
return bazField;
}
}
测试类
import mockit.Capturing;
import mockit.Deencapsulation;
import mockit.Delegate;
import mockit.NonStrictExpectations;
import org.junit.Before;
import org.junit.Test;
public class FooTest
{
FooSubClass fooSubClass;
@Capturing Foo fooMocked;
@Before
public void setUp()
{
fooSubClass = new FooSubClass();
}
@Test
public void testAMethod()
{
new NonStrictExpectations()
{
{
fooMocked.setBaz(anyString);
result = new Delegate()
{
void setBaz(String baz)
{
Deencapsulation.setField(fooSubClass, "bazField", baz);
}
};
times = 1;
fooMocked.getProcessedBaz();
result = new Delegate()
{
String getProcessedBaz()
{
return "PROCESSED_" + Deencapsulation.getField(fooSubClass, "bazField");
}
};
times = 1;
}
};
fooSubClass.setBaz("abc");
System.out.println(fooSubClass.getProcessedBaz());
}
}
关于java - 使用 JMockIt 模拟简单的属性访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24772520/