私は自分のクラスをテストするためにどれだけ深く(ユニット)入るべきか自分に尋ねています。 例として、次の単純なクラスがあります。ユニットテストの注釈?
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());
}
}
それは理にかなっていますか? また、すべての注釈テスト(testClassAnnotations、testPingMethodAnnotations)をスキップして、返す文字列( "pong"、testPingMethod)のみをテストする必要がありますか?
一部の注釈はビジネスロジックの一部(例:PermitAll)なので、テストする必要があります。
webserviceを作成してテストするフルクラスで統合テストを行います安らかなAPI;これは単体テストとは別にすべきです。 –
追加のメディアタイプを@Producesアノテーションに追加すると、テストが中断しますが、テスト中のメソッド内のロジックは変更されません。無意味なテストと同様に脆弱と思われる。 – JamesB
しかし、テストが壊れると、それは悪いですか?私は、このメソッドが特定のメディアタイプだけを生成することを期待しています。別のメディアタイプを追加すると、テストを調整する必要があります。それは良い習慣ではありませんか? PermitAllのようなものをテストすることは、統合テストでもっと複雑になる可能性があります。 Javaクラスの標準isAnnotationPresentメソッドを使用すると、1行のコードでそれをカバーできます。 – lappo