当前位置: 首页 > 知识库问答 >
问题:

使用“this”关键字调用的Mockito存根方法

周翰池
2023-03-14

我必须测试一些SLSB的方法,它在当前对象上html" target="_blank">调用另一个方法(使用这个关键字),我需要以某种方式将它存根。

请考虑以下简化代码:

@Local
public interface SomeService{
    public int someMethod();
    public int anotherMethod();
}

@Stateless()
public class SomeServiceImpl{

    @EJB
    private SomeDAO sDAO;

    public SomeServiceImpl(){}

    public SomeServiceImpl(SomeDAO sDAO){
         this.sDAO = sDAO;
    }

    @Override
    public int someMethod(){
        int dbValue = sDAO.getSomeDBValue(); // 1st stub required here
        return dbValue + this.anotherMethod(); // 2nd stub required here
    }

    @Override
    public int anotherMethod(){
         return 5;
    }
}

为了存根getSomeDBValue()方法,我可以使用@mock和@injectMocks注释将mock注入到该类,但我不知道如何正确地存根anotherMethod()。要存根它,我需要在模拟对象上做这件事,所以我尝试将引用传递到当前对象作为参数,在测试中只传递模拟对象。例如,如果我的方法看起来像这样(不需要存根DAO方法)…

@Override
public int someMethod(SomeServiceImpl sS){ 
    return sS.anotherMethod(); 
}

我使用手动创建的模拟进行的测试如下所示:

@Test
public void someMethodTest() throws Exception {
    SomeServiceImpl sS = mock(SomeServiceImpl.class);
    when(sS.someMethod(any(SomeServiceImpl.class))).thenCallRealMethod();
    when(sS.anotherMethod()).thenReturn(5);
    assertEquals(5, sS.someMethod(sS));
}

方法,对象本身的引用作为参数传递,另一个方法被存根。它起作用了,但它看起来很难看,如果需要使用下面这样的注释注入我的DAO的模拟,该怎么办:

@RunWith(MockitoJUnitRunner.class)
public class SomeClassTest{

    @Mock
    SomeDAO sDAO;

    //@Mock //I can't use those 2 annotations at once
    @InjectMocks
    SomeServiceImpl sS; 

    @Test
    public void someMethodTest() throws Exception {
        //...   
    }
}

据我所知,@InjectMocks注释用于指示类应该在哪里注入用@mock注释的模拟,但对于我的难看的解决方案,我还需要一些ServiceImpl来模拟。

我的解决方案接近正确吗?我应该如何存根anotherMethod()来正确测试someMethod()?传递类的模拟实例是一个好主意吗?我在方法参数中测试的是哪种方法?如果是,我应该如何处理创建带有注释的模拟?

共有1个答案

韩弘方
2023-03-14

在同一类上测试另一个方法时,不应模拟一个方法。理论上可以这样做(例如,使用Mokito间谍)。

从这个意义上说,您是在一个错误的层次上处理这个问题的:实际上,您不应该关心您的被测试方法在您的被测试类中调用了哪些其他方法。您知道,您想测试someMethod()does是否履行了它的约定。如果这需要在您的生产环境中调用anotherMethod()……那么,当单元测试模拟anotherMethod()时,它有多大价值呢?!

另一个想法是:分离关注点,并将anotherMethod()部分移到它自己的类X中。这样,您的测试类就可以包含X的实例;这样的例子就可以被嘲笑了。

 类似资料:
  • 本文向大家介绍JavaScript中的this关键字使用方法总结,包括了JavaScript中的this关键字使用方法总结的使用技巧和注意事项,需要的朋友参考一下 在javascritp中,不一定只有对象方法的上下文中才有this, 全局函数调用和其他的几种不同的上下文中也有this指代。 它可以是全局对象、当前对象或者任意对象,这完全取决于函数的调用方式。JavaScript 中函数的调用有以下

  • 问题内容: 当ai遇到关键字时,我正在研究Java中的方法重写。在Internet和其他来源上进行了大量搜索之后,我得出结论,当实例变量的名称与构造函数的参数相同时,将使用关键字。我是对还是错? 问题答案: 是实例中当前实例的别名或名称。它对于消除实例变量与局部变量(包括参数)的区别很有用,但它本身可以用来简单地引用成员变量和方法,调用其他构造函数重载或简单地引用 实例 。适用用途的一些示例(并非

  • 问题内容: 在Java中使用关键字的最佳做法是什么?例如,我有以下课程: 没关系,但是Java足够聪明,如果我将构造函数中的语句更改为 那么为什么要使用this关键字呢?(我意识到在某些情况下,完全有必要使用它,我只是在问这种情况)。实际上,出于可读性的考虑,我倾向于仅使用关键字,但是常见的做法是什么?例如,在整个商店中使用它会使我的代码看起来有些混乱 显然,代码很少,但是它说明了我的示例。在这些

  • 问题内容: 我试图了解java关键字的this实际作用。我一直在阅读Sun的文档,但对于this实际操作仍然不甚了解。 java 关键字 问题答案: 关键字是对当前对象的引用。 另一种思考方式是关键字就像你用来引用自己的人称代词。对于相同的概念,其他语言使用不同的词。VB使用Me和Python约定(因为Python不使用关键字,只是每个方法的隐式参数)将被使用。 如果要引用本质上属于你的对象,你将

  • 涵义 this关键字是一个非常重要的语法点。毫不夸张地说,不理解它的含义,大部分开发任务都无法完成。 前一章已经提到,this可以用在构造函数之中,表示实例对象。除此之外,this还可以用在别的场合。但不管是什么场合,this都有一个共同点:它总是返回一个对象。 简单说,this就是属性或方法“当前”所在的对象。 this.property 上面代码中,this就代表property属性当前所在

  • 本文向大家介绍JavaScript中的this关键字使用详解,包括了JavaScript中的this关键字使用详解的使用技巧和注意事项,需要的朋友参考一下  和其它许多面向对象的语言一样,JavaScript 中也有 this 关键字,this 在函数中用来指向调用此方法的对象。实际编程中要判断 this 到底指向谁,一般可遵循以下原则:     如果该函数被 Function.call 或者 F