Как внедрить макет объекта, который объявлен как частный статический в тестируемом классе в Java? - PullRequest
0 голосов
/ 07 сентября 2018

У меня есть класс ManageUser, как показано ниже:

public class ManageUser {
private static UserBO gUserBO = new UserBO();

 public String method1() {

    gUserBO.callSomeFunction();

    gUserBO.callSomeOtherFunction();

  }
}

Теперь у меня есть тестовый класс, в котором я хочу протестировать method1 (), и так как методы callSomeFunction () и callSomeOtherFunction () заканчивают тем, что делают вызовы базы данных, я хочу имитировать вызовы этих методов. Я не могу сделать это с помощью макета, поскольку объект в ManageUser является статическим. Как мне продолжить? Я новичок в Junit и Mockito и не могу найти соответствующие ответы.

Ответы [ 2 ]

0 голосов
/ 07 сентября 2018

Вы «не можете сделать это, используя макет», потому что ваш класс плохо спроектирован. В качестве обходного пути вы можете использовать PowerMock (как предложено @ S.K.), Чтобы высмеивать статическое поле, но это только подавит реальную проблему вашего класса.

Лучше воспользуйтесь возможностью и улучшите код для лучшей тестируемости и развития:

Шаг 1. Создайте интерфейс для вашего класса UserBO и дайте ему реализовать его.

public interface UserService {
    void callSomeFunction();
    void callSomeOtherFunction();
}

public class UserBO implements UserService { ... }

Шаг 2: Измените ваш класс ManageUser, чтобы получить любую реализацию UserService через конструктор.

public class ManageUser {
    private final UserService userService;

    public ManageUser(UserService userService) {
        this.userService = userService;
    }

    public String method1() {
        userService.callSomeFunction();
        userService.callSomeOtherFunction();
    }
}

Шаг 3: Измените сторону вызова вашего класса ManageUser, чтобы обеспечить UserService.

Так что вместо

ManageUser manager = new ManageUser();

использование

ManageUser manager = new ManageUser(new UserBO());

Шаг 4: Теперь вы можете легко смоделировать UserService в своем тесте и построить ManageUser с помощью макета.


Эта конструкция также позволяет платформам DI (например, Spring) вводить (или autowire ) компонентов.

0 голосов
/ 07 сентября 2018

Попробуйте использовать Power Mockito:

@RunWith(PowerMockRunner.class)
@PrepareForTest({ManageUser.class})
public class ClassInTest {

    @Test
    public void testStatic() {
       ManageUser mUser = new ManageUser();
       Field field = PowerMockito.field(ManageUser.class, "gUserBO");
       field.set(ManageUser.class, mock(UserBO.class));
       ...
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...