【发布时间】:2014-11-05 13:46:17
【问题描述】:
目前我试图了解@Injectable 和@Tested 注释是如何工作的。我已经做了一些测试并理解了这个概念,但我不知道如何在现实世界的应用程序中使用这些注释。
假设我们正在开发一个依赖于 Web 服务的语言翻译器类。 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();
将始终用真实实例覆盖注入的模拟实例。但是如何在不改变业务逻辑的情况下避免这种行为呢?
【问题讨论】: