Как издеваться над закрытым внутренним классом - PullRequest
6 голосов
/ 08 апреля 2011

У меня есть приложение Spring, и я хочу создать унитарный тест на контроллере, подобном этому. Проблема в том, что класс Wrapper является закрытым внутренним классом, поэтому Wrapper не понимается в тесте. Можно ли издеваться над ним с Mockito без изменения класса контроллера. Я могу использовать prepareData (), чтобы получить экземпляр объекта, но я не знаю, можно ли это использовать для насмешки над этим объектом.

Спасибо

@Controller
public class Controller {

    private class Wrapper {
        private Object1 field1;
        private Object2 field2;
        private Object1 method1(){
           ...
        }
        private Object2 method1(){
           ...
        }
    }

    @ModelAttribute("data")
    public Wrapper prepareData() {
            return new Wrapper ();
}

    public String save(@ModelAttribute("data") Wrapper wrapper, BindingResult result, Model model){
        ...
    }
}

Так что в моем тесте у меня было бы что-то вроде этого

@Test
public void usernameEmpty(){

    BindingResult result = Mockito.mock(BindingResult.class);
    Model model = Mockito.mock(Model.class);
    Wrapper data = //how to mock it
    when(data.method1()).then(new Foo1());
    when(data.method2()).then(new Foo2());
    String returned = controller.save(data, result, model);
    ....
}

1 Ответ

9 голосов
/ 08 апреля 2011

Ваш тест на методах, но он проверяет поведение всего класса. Если ваш внутренний класс является закрытым, то это детали реализации. То, что тест не должен знать. В этом внутреннем классе много поведения, и вы хотите проверить его независимо, может быть, вы должны сделать его публичным и отделенным от этого класса.

Может быть, вы думаете: но тогда ... это много кода для тестирования (очень большая неделимая вещь), не могу ли я проверить что-то меньшее? Ну да. Разработка через тестирование требует минимальной реализации и добавления большего количества кода, только если вы добавляете больше тестов. Итак, вы начинаете с некоторого теста и минимальной реализации и развиваете их обоих до тех пор, пока тесты не будут иметь всю спецификацию, а код - всю реализацию.

Так что не беспокойтесь о частных внутренних классах. Проверь свой классовый контракт!

...