java - 使用 JMockIt 模拟简单的属性访问

标签 java unit-testing properties mocking jmockit

我有一个简单的获取-设置界面:

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/

相关文章:

java - HOCON替换默认值

java - Sprite 不在位置上

javascript - 访问对象属性时如何避免 eval?

java - 在 Eclipse 上运行 Android 应用程序时出现此错误

java - 测试 void 方法的行为

java - JMock assertIsSatisfied 在 TearDown 中?

c# - 代码覆盖率未检测到测试(c# .net 标准)

iphone - 有了 obj-c 中的属性,我们需要声明实例变量吗?

java - Mockito 在 put 请求中给出错误

java - 二分查找中索引越界异常