当前位置: 首页 > 面试题库 >

Mockito Spy-调用构造函数之前的存根

东和怡
2023-03-14
问题内容

我试图监视一个对象,并且想在构造函数调用它之前对构造函数调用的方法进行存根。
我的课看起来像这样:

public class MyClass {
    public MyClass() {
         setup();
    }

    public void setup() {

    }
}

不能调用setup方法。好吧,我如何监视这种方法(以及存根设置,使其什么也不做)?
模拟方法可以很好地工作,但是我想进行单元测试MyClass,因此我将需要其他方法。

之所以需要对设置方法进行打桩以使其无能为力的原因:
我正在对Lego机器人(lejos)进行编程,并在设置中放入了一些代码,该代码需要该机器人能够工作。但是,当我在TinyVM(安装在机器人上的VM)之外调用它时,java崩溃了,因为尚未正确初始化VM(因为测试是在我的PC上运行的)。对于单元测试,设置并不重要。
我无法对类/方法设置调用进行存根处理,因为其中一些是公共静态最终变量。


问题答案:

感谢您的建议,但这有点太复杂了。
最后,我通过扩展类并覆盖我的设置方法来模拟该方法。这样,默认构造函数将不会调用安装程序的实现,而是会调用覆盖的方法。
这是代码:

// src/author/MyClass.java

public class MyClass {
    public MyClass() {
        setup();
    }

    protected void setup() {
        throw new Exception("I hate unit testing !");
    }

    public boolean doesItWork() {
        return true;
    }
}

// test/author/MyClass.java

public class MyClassTest {
    private class MockedMyClass extends MyClass {
        @Override
        protected void setup() {

        }
    }

    private MyClass instance;

    @Before
    public void setUp() { // Not to be confusing with `MyClass#setup()`!
        instance = new MockedMyClass();
    }

    @Test
    public void test_doesItWork() {
        assertTrue(instance.doesItWork());
    }

}

如果您不希望MyTest的安装程序方法被测试以外的其他子类调用或覆盖(因为其他开发人员可能会通过使用安装程序方法将事情弄得很糟),只需将可见性更改为default即可,只有您的类才能呼叫设置。

如果有更简单的方法,请回答问题,因为我对解决方案不是100%满意。



 类似资料:
  • 第二个构造函数应该调用第一个构造函数,但却给了我“递归构造函数调用”错误。 我明白这个错误的意思,只是不明白递归在哪里。第一个contructor将作为参数,而应该是该类型的数组。我错过了什么? 多谢了。

  • 为什么下面没有编译: 如有需要,请提供更多详细信息: 我想将tmp传递给父构造函数

  • 我得到以下错误: 一个月后,我正在检查我的程序,之前相同的代码没有给出错误,我想我没有改变任何可能导致这一点的东西。我试图解决这个问题;所以在第1行的错误中提到:

  • 问题内容: 对不起任何较小的语法错误或其他错误,我正在使用Jitsi模块进行此操作,并且对Java不太熟悉,因此想确认正在发生的事情以及为什么以及如何对其进行修复。 使用按名称加载类方法创建类B的实例时,应用程序正在执行此操作: 在类B中调用重写的load() 初始化变量(根据调试器调用“私有字符串testString = null”),将其无效。 这是预期的Java行为吗?是什么原因造成的?它是

  • 这是我在编写java时从未考虑过的,因为我使用这个模式时没有任何问题: 这样做效果很好,因为重写的函数不依赖于任何未初始化的数据,但是它们对于每个派生的都是唯一的(因此需要抽象)。这在科特林也有效,但它仍然给出了警告。 那么在Java/Kotlin中这种做法是不是很糟糕呢?如果有,我该如何改进?是否可以在kotlin中实现而不被警告在构造函数中使用非final函数? 一个可能的解决方案是将行移动到

  • 我是新的反应,我试图用它开发一个简单的网络应用程序,但我得到了一个错误。当我加载一个类组件时,我的构造函数被调用两次,你能帮忙吗? 原木地被击中两次。在一些组件中,我希望进行一个命中DB的API调用,但我只想命中它一次。在许多情况下,使用并不方便,因为道具只出现在之后,因此我想在中调用(我不会使用setState,这会导致重新加载render)。 提前感谢