Currently I try to understand how the @Injectable
and @Tested
annotations are working. I already did some tests and understood the concept but I didn't get how I can use those annotations in real world applications.
Let's say we are developing a language translator class which depends on a web service. The web service methods are encapsulated in a separate class:
// 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";
}
}
To test the Translator
class independently, we would like to mock the TranslatorWebService
class. According to my understanding, the test class should look like:
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"));
}
}
When I executed this test case for the first time, I expected the result "Haus". At second glance I saw that the line
webService = new TranslatorWebService();
will always override the injected mock instance with a real instance. But how can I avoid this behavior without changing the business logic?