Как написать 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 затем просто внедрите его (предоставьте в конструкторе) и в своем тесте предоставьте макет вместо реальной реализации.

Другие вопросы по тегам