Как написать TestCase в Java для этого сервиса?
У меня есть этот класс
public class AuthenticationModule {
String userName = "foo";
String password = "bar";
public void setUserName(String userName) {
this.userName = userName;
}
public void setPassword(String password ) {
this.password = password ;
}
AuthenticationServicePort authenticationServicePort;
AuthenticationService port;
private boolean authenicate(String userName, String password) {
authenticationServicePort = new AuthenticationServicePort();
port = authenticationServicePort.getAuthenticationServiceProxy();
return port.login(userName, password);
}
public boolean validateUser() {
return authenicate(userName, password);
}
}
а также AuthenticationServicePort
возвращает порт WSDL. Я хочу создать простой контрольный пример с макетом. AuthenticationServicePort
который вернет значение "истина / ложь"
Как мне сделать инъекцию MockObject
без изменения кода Java? Или в худшем случае, что проще всего изменить, чтобы его было легче тестировать.
2 ответа
Вот пример теста, где AuthenticationServicePort
подделан, используя JMockit 1.13:
public class AuthenticationModuleTest
{
@Tested AuthenticationModule authentication;
@Mocked AuthenticationServicePort authenticationService;
@Mocked AuthenticationService port;
@Test
public void validateUser()
{
final String userName = "tester";
final String password = "12345";
authentication.setUserName(userName);
authentication.setPassword(password);
new Expectations() {{ port.login(userName, password); result = true; }};
boolean validated = authentication.validateUser();
assertTrue(validated);
}
}
Вы должны избегать создания экземпляров классов, которые имеют какую-либо логику внутри (не простые объекты DTO). Вместо этого вы должны спроектировать свои классы таким образом, чтобы контейнер внедрения зависимостей мог построить полный граф объектов. В своем коде вы должны ответить сами, если каждый вызов authenicate
Метод нуждается в новом экземпляре AuthenticationServicePort
? Если да, тогда вы должны использовать шаблон фабрики для создания экземпляров этого объекта, и эта фабрика должна быть внедрена (предоставлена в конструкторе), чтобы вы могли смоделировать ее и все, что она произведет. Если много звонков authenticate
метод может повторно использовать тот же экземпляр AuthenticationServicePort
затем просто внедрите его (предоставьте в конструкторе) и в своем тесте предоставьте макет вместо реальной реализации.