Я спрашиваю себя, насколько глубоко я должен проходить (подразделение), тестируя свои классы. Как пример, у меня следующий простой класс.Аннотации для тестирования модулей?
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";
}
}
Я написал следующий тест блок:
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) и поэтому должны быть протестированы.
Я бы выполнил интеграционный тест на полный класс, который создает веб-сервис и тестирует успокоительный апи; это должно быть отдельно от единичных тестов. –
Если вы добавите дополнительный тип мультимедиа в свою аннотацию @Produces, ваш тест прерывается, но вы не изменили никакой логики в тестируемом методе. Кажется, это бессмысленный тест и хрупкий. – JamesB
, но если тест ломается, это плохо? Я имею в виду, я ожидаю, что этот метод создает только определенный тип медиа. Если я добавлю другой тип носителя, я должен настроить мои тесты. Это не хорошая практика? Тестирование чего-то вроде PermitAll может быть намного сложнее с помощью теста интеграции. Использование стандартного метода isnotationPresent классов Java можно было бы охватить в одной строке кода. – lappo