gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:22:43 26 4
gpt4 key购买 nike

目前,我试图了解 @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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com