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