首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用Mockito测试代理方法

用Mockito测试代理方法
EN

Stack Overflow用户
提问于 2015-11-18 09:52:40
回答 2查看 6.4K关注 0票数 0

在类中,像下面这样,doActionOne()doActionTwo()所需的唯一测试是确保它们使用正确的参数委托给doAction()

由于委托doAction(String a, int b, boolean c)方法需要大量的设置,所以任何解决方案都应该防止调用真正的方法。

代码语言:javascript
运行
复制
public class ClassUnderTest {

    public void doActionOne(String a, int b) {
        doAction(a, b, true);
    }

    public void doActionTwo(String a, int b) {
        doAction(a, b, false);
    }

    public void doAction(String a, int b, boolean c) {
        //already tested
    }
}

这样的测试似乎需要某种局部的模拟或间谍,但是我无法得到正确的答案。

测试应该如下所示,尽管这种方法不起作用。

代码语言:javascript
运行
复制
@Test
public void testDoActionOne(){
    ClassUnderTest cut = Mockito.mock(ClassUnderTest.class);

    //call the real method
    when(cut.doActionOne("A1", 1)).thenCallRealMethod();

    //test delegate called with correct params
    verify(cut, times(1)).doAction("A1", 1, true); //fails wanted but not invoked
}

不确定我是否需要这样的东西:

http://docs.mockito.googlecode.com/hg/1.9.5/org/mockito/AdditionalAnswers.html#delegatesTo(java.lang.Object)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-11-18 10:09:11

我知道有两种方法。一种方法是创建一个匿名内部类,其中覆盖不想测试的方法。这不涉及任何莫奇托魔法。另一种方法是使用Mockito对象,这是一个真实实例的代理,允许您为某些方法指定存根行为,并让其他方法传递到实际实例。

方法1,使用匿名内部类:

代码语言:javascript
运行
复制
public class MyTest {

    private String a;
    private String b;
    private boolean c;

    private ClassUnderTest instance = new ClassUnderTest() {
        @Override
        public void doAction(String a, int b, boolean c) {
            MyTest.this.a = a; 
            MyTest.this.b = b;
            MyTest.this.c = c;
        }
    }

    public void test() {
        // SETUP
        String expectedA = "test value A";
        String expectedB = "test value B";
        boolean expectedC = true;

        // CALL
        instance.doActionOne(expectedA, expectedB);

        // VERIFY
        assertEquals(expectedA, a);
        assertEquals(expectedB, b);
        assertEquals(expectedC , c);
    }

方法2,使用Mockito间谍对象:

代码语言:javascript
运行
复制
@RunWith(MockitoJUnitRunner.class)
public class MyTest {

    @Spy
    private ClassUnderTest instance;

    public void test() {
        // SETUP
        String expectedA = "test value A";
        String expectedB = "test value B";
        boolean expectedC = true;
        doNothing().when(instance).doAction(expectedA , expectedB, expectedC);

        // CALL
        instance.doActionOne(expectedA, expectedB);

        // VERIFY
        verify(instance, times(1)).doAction(expectedA , expectedB, expectedC);
    }

因为间谍是由Mockito控制的代理,所以您也可以验证是否在间谍上调用了方法,这正是您在这里需要的。您还可以为doAction指定一个存根返回值(如果它不是一个void方法):

代码语言:javascript
运行
复制
        // SETUP
        doReturn("stubbed value").when(instance).doAction(expectedA , expectedB, expectedC);
票数 2
EN

Stack Overflow用户

发布于 2015-11-18 10:10:58

事情是这样的:

代码语言:javascript
运行
复制
when(object.getFieldValue(attribute)).thenReturn(NESTED_ID);
verify(object, times(1)).getFieldValue(eq(attribute));
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33776716

复制
相关文章

相似问题

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