Подтвердить что ты не робот

Аннотации для тестирования модулей?

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

import javax.annotation.security.PermitAll;
import javax.ejb.Singleton;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;


@Path(value = "ping")
@Singleton
@PermitAll
public class PingRestService {

    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String pingMethod(){
        return "pong";
    }

}

Я написал следующее unit test:

import static org.junit.Assert.*;
import java.lang.reflect.Method;
import javax.annotation.security.PermitAll;
import javax.ejb.Singleton;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

import org.junit.Test;


public class PingRestServiceTest {

    PingRestService prs = new PingRestService();

    @Test
    public void testClassAnnotations(){
        assertEquals(3, prs.getClass().getAnnotations().length);

        assertTrue(prs.getClass().isAnnotationPresent(PermitAll.class));
        assertTrue(prs.getClass().isAnnotationPresent(Singleton.class));
        assertTrue(prs.getClass().isAnnotationPresent(Path.class));

        assertEquals("ping", prs.getClass().getAnnotation(Path.class).value());

    }

    @Test
    public void testPingMethodAnnotations() throws SecurityException, NoSuchMethodException{

        Method method = prs.getClass().getDeclaredMethod("pingMethod");
        assertEquals(2, method.getAnnotations().length);

        assertTrue(method.isAnnotationPresent(GET.class));
        assertTrue(method.isAnnotationPresent(Produces.class));

        assertEquals(1, method.getAnnotation(Produces.class).value().length);
        assertEquals(MediaType.TEXT_PLAIN, method.getAnnotation(Produces.class).value()[0]);
    }

    @Test
    public void testPingMethod() {
        assertEquals("pong", prs.pingMethod());
    }

}

это имеет смысл? Или мне нужно только проверить возвращаемую строку ( "понг", testPingMethod), пропустить все тесты аннотаций (testClassAnnotations, testPingMethodAnnotations)?

Я думаю, что некоторые аннотации являются частью бизнес-логики (например, PermitAll) и поэтому должны быть протестированы.

4b9b3361

Ответ 1

В большинстве случаев проверяется функциональность кода, а не способ его реализации. Это называется Black Box Testing (см.: http://en.wikipedia.org/wiki/Black-box_testing). При тестировании вы должны спросить себя: "Каковы возможные входные значения устройства для тестирования и каковы ожидаемые результаты?" Теперь в тесте вы вызываете свой код с входными значениями и проверяете результат с ожидаемым, чтобы убедиться, что ваш код ведет себя так, как вы этого хотите. Со временем вы можете оптимизировать код, не желая менять функциональность. Тогда вам не нужно менять тест. Но вы можете повторно запустить его, чтобы убедиться, что он по-прежнему ведет себя одинаково. Даже если он реализован по-разному. Или вы можете внести изменения в детали реализации, которые имеют побочные эффекты для тестируемой вами функции. Также в этом случае вам не нужно менять тест, но вам просто нужно его повторно запустить. В вашем простом случае у вас нет ввода и одного статического вывода, поэтому вы можете просто вызвать метод и проверить, возвращается ли "понг". Но реальные случаи жизни, которые протестированы, редко бывают простыми.

Изменить: вы можете увидеть, что настройки @PermitAll настраиваются, и путь URL, который '@Path' настраивает как входные данные, а также проверяет их в тесте интеграции, как это предлагали "Борис Паук" и "Ави". Но другие аннотации являются специфическими для реализации.

Ответ 2

По-моему, эти аннотации - это аспекты вашего класса, а не суть его, его настоящая цель, поэтому его нельзя тестировать на единицу. Возможно, завтра вы будете использовать Spring MVC вместо JAX-RS, но ваш класс будет иметь такое же поведение, поэтому unit test должен быть тем же самым