java - 如何使用 jmockit 注入(inject)模拟依赖

标签 java mocking jmockit

目前,我试图了解 @Injectable@Tested 注释是如何工作的。我已经做了一些测试并理解了这个概念,但我不知道如何在实际应用程序中使用这些注释。

假设我们正在开发一个依赖网络服务的语言翻译类。 Web 服务方法封装在一个单独的类中:

// class to test
public class Translator() {
    private TranslatorWebService webService;

    public String translateEnglishToGerman(String word){
        webService = new TranslatorWebService();
        return webService.performTranslation(word);
    }
}

// dependency
public class TranslatorWebService {
    public String performTranslation(String word){
    // perform API calls    
    return "German Translation";
    }
}

要独立测试 Translator 类,我们要模拟 TranslatorWebService 类。根据我的理解,测试类应该是这样的:

public class TranslatorTest {
    @Tested private Translator tested;
    @Injectable private TranslatorWebService transWebServiceDependency;

    @Test public void translateEnglishToGerman() {
        new Expectations() {{
            transWebServiceDependency.performTranslation("House");
            result = "Haus";
        }};

        System.out.println(tested.translateEnglishToGerman("House"));
    }
}

当我第一次执行这个测试用例时,我期望结果是“Haus”。第二眼我看到那行

webService = new TranslatorWebService();

将始终用真实实例覆盖注入(inject)的模拟实例。但是如何在不改变业务逻辑的情况下避免这种行为呢?

最佳答案

好问题。关于 JMockit(或任何其他模拟 API)对依赖项注入(inject)的支持,需要注意的是它仅在被测代码实际依赖于其依赖项注入(inject)时才使用。

Translator 示例类依赖TranslatorWebService 依赖项的注入(inject);相反,它通过内部实例化直接获取它。

因此,在这种情况下,您可以简单地模拟依赖关系:

public class TranslatorTest {
    @Tested Translator tested;
    @Mocked TranslatorWebService transWebServiceDependency;

    @Test public void translateEnglishToGerman() {
        new Expectations() {{
            transWebServiceDependency.performTranslation("House");
            result = "Haus";
        }};

        String translated = tested.translateEnglishToGerman("House");

        assertEquals("Haus", translated);
    }
}

关于java - 如何使用 jmockit 注入(inject)模拟依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26758751/

相关文章:

java - 放入完整英语词典的数据结构,以便从 Android 中的 String 快速返回所有可能的单词完成

java - 无法将 JLabel 添加到 JPanel

python - 使用 SQLAlchemy DBSession 对 Pyramid View 进行单元测试的正确方法是什么?

java - 使用 'any' 使用 JMockit stub 静态方法

java - 是否可以使用 JMockit 来模拟局部变量?

java - 在 while 循环中获取用户输入

java - (Java) 在 Switch Case 中使用空行退出 While 循环

unit-testing - Grails-在单元测试中模拟servletContext

ruby-on-rails - 如何链接 allow_any_instance_of 与 Rspec

jmockit - 有没有办法使用JMockit模拟spring的jdbcTemplate?