Есть ли альтернатива фиктивным объектам в модульном тестировании? - PullRequest
4 голосов
/ 08 января 2010

Это корпоративное веб-приложение на Java (с использованием JUnit) без предварительно созданных фиктивных объектов, и для их создания потребуется значительное количество времени, которое, по оценкам, не предполагается. Существует ли парадигма тестирования, которая дала бы мне «некоторый» тестовый охват, но не полный охват?

Ответы [ 7 ]

6 голосов
/ 08 января 2010

Вы пробовали динамический фреймворк, такой как EasyMock ? Это не требует от вас «создания» объекта Mock, так как вам нужно написать весь класс - вы указываете поведение, которое вы хотите, в самом тесте.

Пример класса, который использует UserService для поиска сведений о пользователе для входа в систему:

//Tests what happens when a username is found in the backend
public void testLoginSuccessful() {
    UserService mockUserService = EasyMock.createMock(UserService.class);

    EasyMock.expect(mockUserService.getUser("aUsername")).andReturn(new User(...));
    EasyMock.replay(mockUserService);

    classUnderTest.setUserService(mockUserService);

    boolean isLoggedIn = classUnderTest.login("username");
    assertTrue(isLoggedIn);
}

//Tests what happens when the user does not exist
public void testLoginFailure() {
    UserService mockUserService = EasyMock.createMock(UserService.class);

    EasyMock.expect(mockUserService.getUser("aUsername")).andThrow(new UserNotFoundException());
    EasyMock.replay(mockUserService);

    classUnderTest.setUserService(mockUserService);

    boolean isLoggedIn = classUnderTest.login("username");
    assertFalse(isLoggedIn);
}
3 голосов
/ 08 января 2010

(1) Альтернативы модульному тестированию (и имитациям) включают интеграционное тестирование (с dbUnit ) и FIT тестирование. Для получения дополнительной информации см. Мой ответ здесь .

(2) Рамка для насмешек Mockito выдающаяся. Вы не должны были бы "предварительно строить" любые насмешки. Его относительно легко внедрить в проект.

1 голос
/ 09 января 2010

Что ж, один простой, если не самый простой, способ получить высокий уровень покрытия кода - это написать код сначала в тестовом режиме, следуя тест-управляемой разработке (TDD). Теперь, когда код существует, без модульных тестов, его можно считать устаревшим кодом.

Вы могли бы написать сквозной тест, внешний для вашего приложения, это не будут модульные тесты, но они могут быть написаны, не прибегая к каким-либо насмешкам. Или вы можете написать модульные тесты, охватывающие несколько классов, и только высмеивать классы, которые мешают вашим модульным тестам.

1 голос
/ 09 января 2010

Я бы повторил то, что другие говорят о EasyMock. Однако, если у вас есть кодовая база, где вам нужно смоделировать такие вещи, как вызовы статических методов, финальные классы или методы и т. Д., Тогда взгляните JMockit .

0 голосов
/ 09 января 2010

Вы должны попробовать EasyMock .

0 голосов
/ 08 января 2010

Я думаю, что трудно наоборот - найти методологию тестирования, которая дает вам полное покрытие, если вообще возможно, в большинстве случаев.

0 голосов
/ 08 января 2010

Есть ли у вас данные реального мира, которые вы можете импортировать на испытательный стенд, чтобы использовать их в качестве «фиктивных объектов», которые будут быстрыми

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...