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

如何在运行junit测试用例时避免实际的方法调用

邴姚石
2023-03-14

我有以下场景。

一个类,其中我有一个API,其内容如下:

class MyClass {
    public void myAPI() {
        ...
        MyOtherClass myOtherObj = new MyOtherClass();
        String value = myOtherObj.decodeAndGetName();
        ...
    }
}

这里我们有一个MyOtherClass,它包含一个执行某些操作的API decodeAndGetName()。它在另一个包中,我无法修改它的代码。

要求

我需要为上面的myAPI()编写一个jUnit测试。现在我想以某种方式模拟Myther Class的对象并模拟decdeAndGetName()的返回值。

我无法做到这一点,因为我们有一个新的MyOtherClass(),一旦流到达这一行,它就会创建一个新实例并转到decodeAndGetName()API。我需要的是,某种方法来防止流转到decodeAndGetName(),并在上述代码中遇到此调用时使用模拟值。

请让我知道这样做的方法。

共有1个答案

须鸿祯
2023-03-14

我只在Android代码中使用过它,但我认为您可以在测试中使用类似Mockito的东西来模拟MyOtherClass,代码类似于:

MyOtherClass mockMyOtherClass = Mockito.mock(MyOtherClass.class);
when(mockMyOtherClass.decodeAndGetName()).thenReturn(new String("known return value");

我还建议使用依赖注入,并使用Guice之类的工具来实现这一点。我使用Guice的组合

简要示例
以下是您的代码在使用Guice设置依赖注入后的样子:

MyOtherClassWrapper。Java语言

@Singleton
public class MyOtherClassWrapper {

    private MyOtherClass myOtherClass = new MyOtherClass();

    public String decodeAndGetName() {
        return getMyOtherClass().decodeAndGetName();
    }

    ...

    private MyOtherClass getMyOtherClass() {
        return myOtherClass;
    }

}

MyClass.java

class MyClass {

    ...

    @Inject private MyOtherClassWrapper myOtherClassWrapper;

    ...

    public void myAPI() {
    ...
    String value = getMyOtherClassWrapper().decodeAndGetName();
    ...
    }

    private MyOtherClass getMyOtherClassWrapper() {
        return myOtherClassWrapper;
    }
}

有关如何开始设置Guice的信息,请参阅Guice用户指南。这并不太难。

 类似资料:
  • 问题内容: 我已经从JUnit3.8切换到JUnit4.4。我使用ant运行测试,所有测试均成功运行,但测试实用程序类失败,并显示“无可运行方法”错误。我使用的模式是在测试文件夹下包括所有名称为 Test 的类。 我知道,运行程序找不到任何带有@Test属性注释的方法。但是它们不包含此类注释,因为这些类不是测试。令人惊讶的是,当在Eclipse中运行这些测试时,它不会抱怨这些类。 在JUnit3.

  • 问题内容: 我在JUnit中有许多测试用例。它们都需要相同的代码才能在其静态方法中执行。这是代码重复,我正在努力摆脱它。这样做是一种肮脏的方式。JUnit中是否还有其他机制可能会有所帮助? PS。我写了关于这个主题的博客文章:http : //www.yegor256.com/2015/05/25/unit-test- scaffolding.html 问题答案: 规则是构成可重用代码(而不是从其

  • 问题内容: 在Eclipse和Ant中运行Junit测试时,我遇到了差异。这是场景: 一切都按照Eclipse的预期运行,但是,当我运行了一个Ant构建脚本时,我无法获得准确的Junit报告。我对测试运行器和测试用例进行了几处更改(简而言之,我向所有测试用例中添加了Test suite()方法),这返回了一个新的Junit4TestAdapter,并让我们的自定义运行器执行RunNotifier.

  • 我正在为公共方法创建一个使用JUnit的测试用例。这个方法调用同一个类中的一个私有方法,这个私有方法最终调用单独类中其他方法的序列,就像业务逻辑一样。所有方法都返回一个并发HashMap,我只想测试返回值上的。 我如何避免方法调用的级联? 如果我去嘲笑流的所有方法,那么我的测试案例就会变得巨大。我怎样才能避免这些调用,只对我的方法执行黑盒测试,即传递参数和理论收益。 我的方法是: 它从此类调用的私

  • 我正在为java应用程序编写junit测试用例这里是junit测试代码 在eclipse中运行这段代码后,我会收到以下错误 下面是我的主要java代码 有人能帮忙解决这个错误吗?在这里,我不能单独运行两个测试函数,它们运行得很好,如何一起运行它们

  • 问题内容: 我想从命令行运行JUnit测试用例。我怎样才能做到这一点? 问题答案: 对于JUnit 5.x,它是: 查找在简要https://stackoverflow.com/a/52373592/1431016的全部细节https://junit.org/junit5/docs/current/user-guide/#running-tests-console-launcher 对于JUnit