null以外のHttpServletRequestを何らかの方法で渡すか、エラーをスローしているHelperClass.getUser(request)を制御する必要があります(メソッドは内部でrequest.getHeader()を実行し、リクエストがnullであるため、エラーをスローしてテストに失敗します)。
REST APIの単体テストを行いたいので、変更(または開発者)がそれを壊したり、バグなどがあったりして、最終的にTDD/BDDを開始するかどうかをすぐに知ることができます。これらのテストは、最終的にはantによる自動ビルドで使用する予定です。私はRESTAPIを呼び出し、Javaからヘッダーを設定できますが、これは単体テストではないと思いますか?ローカルホストで実行することに依存しますか?それについて間違っている可能性があります
コード:
@Path("service/")
public class Service {
static DataAccess da = null;
@javax.ws.rs.core.Context HttpServletRequest request;
//constructor where doa will be mock object
public Service(DataAccess dao){
da = dao;
}
@GET
@Path("custom-object/{date}/{batch}")
@Produces({"application/xml", "application/json", "application/x-protobuf"})
//Method to test
public CustomObject getCustomObject(
@PathParam("date") String date,
@PathParam("batch") int batch,
@QueryParam("type") String type) {
String user = HelperClass.getUser(request); // this is causing me issues
//da will be a mock object
CustomObject returnedVal = da(user,DatatypeConverter.parseDateTime(date).getTime(), batch, artifactType);
return returnedVal;
}
}
junit / mockitoを使用してテストします(ソリューションとしてpowermockを使用してください):
@Test
public void testGetCustomObject() {
System.out.println("getCustomObject");
//Arrange
DataAccess da = mock(DataAccess.class);
Service instance = new Service(da);
String date = "2010-04-05T17:16:00Z";
int batch = 0;
String type = "";
CustomObject expResult = null;
//Act
CustomObject result = instance.getCustomObject(date, batch, type);
//Assert
assertEquals(expResult, result);
}
をハードコーディングすると、テストに合格しString user="123";
ます。有用なテストを書く前に、この問題を克服する必要があります。誰でもこのコード行をモック/制御してuser
null以外の文字列として効果的に設定するためのサンプルコードを提供できますか(この行String user = HelperClass.getUser(request);
はすべてのAPIメソッドにあります)